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

Why ASP.NET Core adds claims twice into User.Claims property?

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

代码片段

    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.ClaimsOnTokenValidated 处理程序

中的快速观察

然而,当我在 Home 控制器中调试 User.Cliams 时验证成功后,我看到所有声明都添加了两次。
下面是家庭控制器

User.Claims的快速观看

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

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