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);
    }