IdentityServer4 (v3.1.x) Entity Framework - 会话不持久

IdentityServer4 (v3.1.x) Entity Framework - Session not persistent

我将 IdentityServer4 (v3.1.x) 与 Entity Framework 包一起使用,以允许将配置和操作设置存储在数据库中。但是我注意到,由于某些原因,用户登录 IS4 的持续时间由 IIS 应用程序池 'recycle interval' 设置决定,我目前将其设置为 30 分钟。这与预期的行为不同,用户的会话只要 access_token 持续时间/refresh_token 持续时间允许。

当 IIS 应用程序池 'recycle interval' 设置为更高的值(最多 1740 分钟)时,问题消失。然而,我期望 'session'(因为缺少更好的名称)在应用程序池和应用程序池回收之间持久存在。

我做错了什么,我需要更改什么才能使其正常工作?

时长:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    string connectionString = _config.GetValue<string>("ConnectionStrings:IdentityServerDBConnectionString");
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
    
    services.AddDbContext<IdentityServerDBContext>(x => x.UseSqlServer(connectionString));

    var builder = services.AddIdentityServer(
        options => {
            options.Authentication.CookieLifetime = TimeSpan.FromDays(14);  // As test
        }
    )
        .AddSigningCredential(LoadCertificate())
        .AddConfigurationStore(options =>
        {
           options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
               sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddOperationalStore(options =>
        {
           options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
               sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddProfileService<ProfileService>();

    // Custom implementations
    services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>();
    services.AddTransient<IProfileService, ProfileService>();

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
       .AddCookie(o =>
       {
           o.SlidingExpiration = false;
           o.ExpireTimeSpan = TimeSpan.FromDays(14);  // As test
       });

    services.AddAuthorization();
}

*编辑: 正如 Tore 在下面的评论中指出的那样,缺少 DataProtection 实现是问题的原因。

使用他分享的链接,我能够通过添加 Microsoft.AspNetCore.DataProtection 包并将以下代码片段添加到 Startup 来解决它:

// Persistent data protection
services
    .AddDataProtection()
    .PersistKeysToDbContext<DBContext>();

Cookie 使用 ASP.NET 核心中的数据保护 APIs 进行加密,对于生产而言,正确配置它是明智的,因此加密 key/key-ring 会在您的网络之外持续存在-申请.

我在此处写了关于数据保护的博客 API:

另请参阅这些链接: