Background:
我们已将IdentityServer3配置为使用外部WS-Fed IdentityProvider .
在进行身份验证时,我们会将数据库中的自定义声明添加到传出的id_token中 .
这很有效,客户端应用程序能够在授权代码流完成时读出添加到id_token的自定义声明 .
Problem:
当用户注销(甚至手动删除cookie)并再次登录时,IdentityServer3不会使用为用户更新到数据库的新声明值更新id_token .
出于某种原因,IdentityServer3会保留用户首次登录时添加到id_token的第一个声明值 .
即使下面的自定义声明代码确实运行并获取新声明并添加到AuthenticationTicket中的ClaimIdentity,后续登录也不会提取从数据库中检索到的更新声明值 .
What we debugged and already know:
-
未缓存数据库声明
-
已将更新的数据库声明添加到ClaimsIdentity
-
即使在注销和登录后,更新的数据库声明也未在id_token中更新 .
-
将访问令牌生存期和ID令牌生存期设置为20秒并等待超过这些时间不起作用 .
-
使用不同的浏览器不起作用 .
What seems to work:
- 在登录尝试之间重新启动IdentityServer . 所以我们认为IdentityServer正在创建并保持一些缓存或会话?
码:
/// <summary>
/// Initializes IdentityServer3 for ADFS Federation
/// </summary>
/// <param name="app">The application bulder</param>
/// <param name="signInAsType">SignInType</param>
private static void ConfigureIdentityProviders(IAppBuilder app, string signInAsType)
{
var adfs = new WsFederationAuthenticationOptions
{
AuthenticationType = "adfs",
Caption = "ADFS",
SignInAsAuthenticationType = "idsrv.external",
MetadataAddress = "../FederationMetadata/2007-06/FederationMetadata.xml",
Wtrealm = "urn:idsrv11",
UseTokenLifetime = false,
Notifications = new WsFederationAuthenticationNotifications
{
SecurityTokenValidated = n =>
{
var externalProviderClaims = n.AuthenticationTicket.Identity.Claims.ToList();
// Add custom claim
externalProviderClaims.Add(new Claim("test", DateTime.Now.Ticks.ToString()));
var newIdentity = new ClaimsIdentity(
externalProviderClaims, n.AuthenticationTicket.Identity.AuthenticationType);
n.AuthenticationTicket = new AuthenticationTicket(newIdentity, n.AuthenticationTicket.Properties);
return Task.FromResult(0);
}
}
};
app.UseWsFederationAuthentication(adfs);
}