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

LP1*_*P13 4 asp.net-core-mvc coreclr identityserver3 asp.net-core

我有 asp.net core 应用程序,该应用程序正在使用 IdentityServer3 使用 OpenIdConnect 身份验证。当用户成功通过身份验证后,应用程序会从身份服务器收到正确的声明。我可以调试线路TokenValidatedContext.Ticket.Principal.ClaimsOnTokenValidatd确保应用程序收到所有声明。

代码片段

    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);
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)

下面是处理程序 TokenValidatedContext.Ticket.Principal.Claims中的快速观看OnTokenValidated

在此输入图像描述

但是,在家庭控制器中调试成功进行身份验证后User.Cliams,我看到所有声明都添加了两次。下面是Home控制器
的快速观看User.Claims

在此输入图像描述

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

ade*_*lin 5

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