为什么ASP.NET Core会在User.Claims属性中添加两次声明?

时间:2016-10-05 18:37:32

标签: asp.net-core asp.net-core-mvc identityserver3 coreclr

我有asp.net核心应用程序,应用程序正在使用IdentityServer3进行OpenIdConnect身份验证。当用户成功通过身份验证后,应用程序会从身份服务器接收正确的声明。我可以调试TokenValidatedContext.Ticket.Principal.Claims中的行OnTokenValidatd,并确保应用程序收到所有声明。

代码段

    var connectOptions = new OpenIdConnectOptions()
        {
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            Authority = authority,
            ClientId = clientId,
            ResponseType = IdentityConstant.IdTokenClaim,
            AuthenticationScheme = IdentityConstant.OpenIdAuthenticationScheme,
            SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme,
            PostLogoutRedirectUri = postlogoutRedirectUri,
            CallbackPath = IdentityConstant.CallbackPath,
            Events = new OpenIdConnectEvents()
            {
                OnTokenValidated = async context =>
                {
                    var claims = context.Ticket.Principal.Claims;
                    await Task.FromResult(0);
                }
            }
        };

下面是TokenValidatedContext.Ticket.Principal.Claims处理程序

OnTokenValidated的快速监视

enter image description here

但是,在我在家庭控制器中调试User.Cliams后成功验证后,我看到所有声明都被添加了两次。
以下是家庭控制器中User.Claims的快速监视

enter image description here

为什么声明会在User.Claims中添加两次?

1 个答案:

答案 0 :(得分:4)

因为您将openidconnect的AutomaticAuthenticate设置为true。如果您查看用户身份,您将看到有两个身份(一个用于cookie,其他用于openidconnect身份验证)。由于User.Claims是这些身份声明的总和,因此您会看到两次声明。因此,从openidconnect选项中删除AutomaticAuthenticate = true,可以解决问题。