名称声明返回用户名而不是名称

时间:2019-03-18 09:38:46

标签: c# entity-framework asp.net-core oauth identityserver4

我对Identity Server 4的id令牌中返回的某些值有问题。id令牌和userinfo端点都返回用户名,而不是名称声明的名称。

{ 
  ........

  "preferred_username": "JohnD",
  "name": "JohnD",
  "email": "xxx@xxx.dk",      

  .....
}

如您所见,preferred_username和name具有相同的值。如果我检查数据库。

  • 用户名:JohnD
  • 姓名:John Doe
  • 电子邮件:xxx@xxx.dk

我直接从身份服务器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"
 ]

我还试图从列表中删除该声明,但它是只读的。

1 个答案:

答案 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;
        }
    }