Название претензии, возвращающее имя пользователя, а не имя - PullRequest
0 голосов
/ 18 марта 2019

У меня проблема с некоторыми значениями, возвращаемыми в токене id сервером Identity 4. Идентификационный токен и конечная точка userinfo возвращают имя пользователя вместо имени для утверждения имени.

{ 
  ........

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

  .....
}

Как видите, и имя_пользователя_имя, и имя имеют одинаковое значение. Если я проверю в базе данных.

  • Имя пользователя: JohnD
  • Имя: Джон Доу
  • E-mail: xxx@xxx.dk

Я скопировал DefaultProfileService.cs Непосредственно с сервера идентификации 4.

Так что мой код такой же

/// <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": [
"John Doe",
"JohnD"
 ]

Я также пытался удалить заявку из списка, но только для чтения.

1 Ответ

0 голосов
/ 18 марта 2019

Хорошо, спасибо Кирку Ларкину за то, что он указал мне справа прямо через комментарий.

У меня действительно была перегрузка для UserClaimsPrincipalFactory уже в моем коде, я просто пошел дальше, скопировал строки с ошибками из официального кода и поменял местами все вокруг.

Однако теперь мне интересно, верно ли мое понимание разницы между именем и предпочитаемым именем пользователя.

 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;
        }
    }
...