我对Identity Server 4的id令牌中返回的某些值有问题。id令牌和userinfo端点都返回用户名,而不是名称声明的名称。
{
........
"preferred_username": "JohnD",
"name": "JohnD",
"email": "xxx@xxx.dk",
.....
}
如您所见,preferred_username和name具有相同的值。如果我检查数据库。
我直接从身份服务器4复制了DefaultProfileService.cs。
所以我的代码是相同的
/// <summary>
/// This method is called whenever claims about the user are requested (e.g. during token creation or via the userinfo endpoint)
/// </summary>
/// <param name="context">The context.</param>
/// <returns></returns>
public virtual Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.LogProfileRequest(Logger);
context.AddRequestedClaims(context.Subject.Claims);
context.LogIssuedClaims(Logger);
return Task.CompletedTask;
}
我可以看到那个context.Subject.Claims似乎已经填充了这些数据,而且我无法缝制将其删除或越过它。
我不确定该如何解决
我尝试添加preferred_username声明,但现在我获得了双打。
"preferred_username": [
"John Doe",
"JohnD"
]
我还试图从列表中删除该声明,但它是只读的。
答案 0 :(得分:0)
感谢Kirk Larkin通过评论直接将我指向右边。
实际上,我的代码中确实存在UserClaimsPrincipalFactory的重载,我才继续从官方代码中复制有问题的行并交换内容。
但是我现在想知道我对名称和preferred_username之间的区别的理解是否不正确。
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole<long>>
{
public CustomUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole<long>> roleManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
var userId = await UserManager.GetUserIdAsync(user);
var userName = await UserManager.GetUserNameAsync(user);
var id = new ClaimsIdentity("Identity.Application",
Options.ClaimsIdentity.UserNameClaimType,
Options.ClaimsIdentity.RoleClaimType);
id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId));
id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, user.Name));
id.AddClaim(new Claim("preferred_username", userName));
if (UserManager.SupportsUserSecurityStamp)
{
id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
await UserManager.GetSecurityStampAsync(user)));
}
if (UserManager.SupportsUserClaim)
{
id.AddClaims(await UserManager.GetClaimsAsync(user));
}
return id;
}
}