首页 > 解决方案 > IdentityServer4 无法读取所有声明

问题描述

我在 asp.net core 2.2 中使用 IdentityServer4。

我的获取个人资料数据是:

 public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(sub);
        var principal = await _claimsFactory.CreateAsync(user);

        var claims = principal.Claims.ToList();

        claims.Add(new Claim(ClaimTypes.NameIdentifier, "fullname"));

        context.IssuedClaims = claims;
    }

我添加了客户端如下:

 new Client
            {
                ClientId = "client",
                ClientName = "Application",
                AllowedGrantTypes = GrantTypes.Hybrid,
                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },
                RedirectUris           = { "http://localhost:45876/signin-oidc" },
                PostLogoutRedirectUris = { "http://localhost:45876/signout-callback-oidc" },
                AllowedCorsOrigins = new[] { "http://localhost:45876/" },
                AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "webapi"
                    },
                AllowOfflineAccess = true
            },

当我在客户中阅读声明时,我有一些声明并非全部主题。名称标识符为空?

httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;

我的问题是什么?我应该怎么办?

标签: asp.net-coreidentityserver4claims

解决方案


Profile Service 将帮助动态添加用户的声明。该声明可以添加到身份令牌、访问令牌或用户信息端点中。常量IdentityServerConstants.ProfileDataCallers包含不同的常量值。您可以通过过滤来跟踪逻辑context.Caller

关注 ID Token 的长度,默认情况下,声明不会包含在 ID token 中。您可以使用以下解决方案之一将自定义声明添加到客户端应用的用户声明原则:

  1. 在客户端应用程序中,您可以options.GetClaimsFromUserInfoEndpoint = true在 OpenID 连接选项中进行设置,以便客户端应用程序向 OIDC 的 userinfo 端点发送请求以获取额外的声明,然后您可以使用ClaimActions.MapJsonKey将声明映射到用户声明/cookie:

    options.GetClaimsFromUserInfoEndpoint = true;
    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, ClaimTypes.NameIdentifier);
    
  2. 另一种解决方案是在 Identity Server 中注册客户端时设置AlwaysIncludeUserClaimsInIdTokentrue定义声明将添加到 id 令牌,客户端应用程序将直接将声明从 ID 令牌映射到用户声明原则:

    AlwaysIncludeUserClaimsInIdToken =true
    

推荐阅读