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'(因为缺少更好的名称)在应用程序池和应用程序池回收之间持久存在。
我做错了什么,我需要更改什么才能使其正常工作?
时长:
- IdentityTokenLifetime:300s / 5m
- IdentityAccessToken: 300s / 5m
- AuthorizationCodeLifetime: 300s / 5m
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:
另请参阅这些链接:
我将 IdentityServer4 (v3.1.x) 与 Entity Framework 包一起使用,以允许将配置和操作设置存储在数据库中。但是我注意到,由于某些原因,用户登录 IS4 的持续时间由 IIS 应用程序池 'recycle interval' 设置决定,我目前将其设置为 30 分钟。这与预期的行为不同,用户的会话只要 access_token 持续时间/refresh_token 持续时间允许。
当 IIS 应用程序池 'recycle interval' 设置为更高的值(最多 1740 分钟)时,问题消失。然而,我期望 'session'(因为缺少更好的名称)在应用程序池和应用程序池回收之间持久存在。
我做错了什么,我需要更改什么才能使其正常工作?
时长:
- IdentityTokenLifetime:300s / 5m
- IdentityAccessToken: 300s / 5m
- AuthorizationCodeLifetime: 300s / 5m
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:
另请参阅这些链接: