我在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
},
当我在客户中阅读声明时,我有一些声明不是全部主题。 NameIdentifier为空?
httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
我的问题是什么?我该怎么办?
答案 0 :(得分:1)
您必须指定用于从json用户数据中选择值的声明,并创建Claims。这是在OpenIdConnectOptions
中完成的:
services
.Authentication()
.AddOpenIdConnect(options => {
// For map all claims
options.ClaimActions.MapAll();
});
答案 1 :(得分:1)
个人资料服务将帮助动态添加用户的声明。该声明可以添加到身份令牌,访问令牌或用户信息端点中。常量IdentityServerConstants.ProfileDataCallers
包含不同的常量值。您可以通过过滤context.Caller
来跟踪逻辑。
担心ID令牌的长度,默认情况下,声明不会包含在ID令牌中。您可以使用以下解决方案之一向客户应用的用户声明原则添加自定义声明:
在客户端应用程序中,您可以在OpenID连接选项中设置options.GetClaimsFromUserInfoEndpoint = true
,以便客户端应用程序将请求发送到OIDC的userinfo端点以获取额外声明,然后可以使用ClaimActions.MapJsonKey
将声明映射到用户声明/ Cookie:
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, ClaimTypes.NameIdentifier);
在Identity Server中注册客户端时,将另一解决方案设置为AlwaysIncludeUserClaimsInIdToken
到true
,以便自定义声明将添加到id令牌中,并且客户端应用程序将直接将声明从ID令牌映射到用户索赔原则:
AlwaysIncludeUserClaimsInIdToken =true