我有一个使用外部提供者进行身份验证的IdentityServer实现,以及一个使用oidc-client库实现oidc隐式流的客户端应用程序。所有工作正常(登录、注销、刷新令牌、ecc…)直到IdentityServer关闭(例如,由于不活动)。
当IdentityServer重新启动时,如果会话/令牌仍然有效,我的客户端也会被重定向到登录。我尝试使用OperationalStore或InMemoryPersistedGrants,但在服务重新启动后,在没有关闭浏览器的情况下,我总是有相同的行为。就像在启用了OperationalStore的数据库中存储了任何会话/令牌一样。取而代之的是,cookie被浏览器会话正确地持久化,并允许在重启后在IdentityServer页面中导航,而无需询问登录。
在服务重新启动后,(从客户端)重定向到登录的API调用如下: IdS-server/connect/authorize?client_id=client-id&redirect_uri=redirectUri&response_type=code&scope=scopes&state=state&code_challenge=codeChallenge &code_challenge_method=S256&response_mode=query
我的IdentityServer中是否有一些缺失或错误的配置?
//
// IdentityServerBuilder
//
identityServerBuilder = services.AddIdentityServer();
// this adds the operational data from DB (codes, tokens, consents)
identityServerBuilder.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder =>
builder.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
// this enables automatic token cleanup. this is optional.
options.EnableTokenCleanup = true;
options.TokenCleanupInterval = 30;
});
identityServerBuilder.AddInMemoryIdentityResources(identityServerService.GetIdentityResources())
.AddInMemoryApiScopes(identityServerService.GetApiScopes())
.AddInMemoryApiResources(identityServerService.GetApiResources())
.AddInMemoryClients(identityServerService.GetClients());
identityServerBuilder.AddTestUsers(identityServerService.GetUsers().ToTestUsers().ToList());
identityServerBuilder.AddDeveloperSigningCredential();
//
// AuthenticationBuilder
//
var cookieScheme = identityServerConfig.GetCookieSchemeOrDefault();
if (identityServerConfig.IsCookieSchemeCustom())
{
authenticationBuilder = services.AddAuthentication(cookieScheme).AddCookie(cookieScheme, options =>
{
options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
});
}
else
{
authenticationBuilder = services.AddAuthentication().AddCookie(options =>
{
options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
});
}发布于 2021-04-27 20:35:52
因为您在生产中使用以下语句:
AddDeveloperSigningCredential()这意味着,如果您在整个开发过程中没有记住令牌签名密钥,则将重新创建它。最佳实践是在生产中不使用此语句,而是添加一个更永久的签名密钥,可能是在数据库中,或者在Azure密钥库或其他可以安全存储它的地方。
第二件事是,您还需要配置Data Protection API,并将一个加密密钥传递给它,该密钥也保存在您的系统之外。这与签名密钥问题类似。我写了一篇关于它的博客文章here。部署之间的加密密钥必须相同,否则用户将在重新部署后注销,因为他们的cookie将不再被接受。
https://stackoverflow.com/questions/67283000
复制相似问题