Изменение заявки в ProfileService сервера идентификации не отражается в файле cookie аутентификации

#identityserver4 #asp.net-core-3.1 #asp.net-core-identity

#identityserver4 #asp.net-core-3.1 #asp.net-core-identity

Вопрос:

Использование ASP.NET Ядро 3.1 и сервер идентификации 4 Я запускаю процесс входа в систему из SPA.

После входа в систему у меня есть следующие требования к cookie-файлам аутентификации приложения IS4:

 sub                              1
AspNet.Identity.SecurityStamp    RRHNY65RQMUHTXXSIZKT2YORA3QQ2WAC
role                             Admin
preferred_username               info@example.com
name                             info@example.com
email                            info@example.com
email_verified                   true
amr                              pwd
idp                              local
auth_time                        1598736198
  

Почему name заявка получает электронное письмо в качестве своего значения?

Затем я внедрил ProfileService для замены name заявки на фактическое имя пользователя.

Когда я проверяю заявки в spa, замена была выполнена…

Но в приложении IS4 Cookie-файл аутентификации по-прежнему получает электронное письмо в качестве name заявки.

Почему?

Ответ №1:

Верны ли утверждения в токене идентификации?

Если это правильно в ID-токене, то у вас, вероятно, есть какое-то преобразование утверждений, реализованное в вашем ASP.NET Основное приложение.

Комментарии:

1. Я только что добавил ответ на свой собственный вопрос с решением. Я полагаю, что то, что я опубликовал, является правильным способом сделать это. Что вы думаете?

Ответ №2:

Похоже, проблема заключалась в том, как ASP.NET Ядро 3.1 определяет требования.

Затем я реализовал UserClaimsPrincipalFactory обновление name заявки:

 public class UserClaimsPrincipalFactory : UserClaimsPrincipalFactory<User> {

  public UserClaimsPrincipalFactory(UserManager<User> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor) { } 

  public async override Task<ClaimsPrincipal> CreateAsync(User user) {

    ClaimsPrincipal principal = await base.CreateAsync(user);
    ClaimsIdentity identity = (ClaimsIdentity)principal.Identity;

    Claim claim = identity.FindFirst("name");
  
    if (claim != null)
      identity.RemoveClaim(claim);

    identity.AddClaim(new Claim("name", user.Name));

    return principal;

  }

}
  

И теперь cookie-файлы аутентификации и токен имеют одинаковые требования.

Использование IdentityServer4 ProfileService изменяет только требования к токену:

   public class ProfileService : IProfileService {
    
    private readonly IUserClaimsPrincipalFactory<User> _claimsFactory;
    private readonly UserManager<User> _userManager;

    public ProfileService(UserManager<User> userManager, IUserClaimsPrincipalFactory<User> claimsFactory) {
      _userManager = userManager;
      _claimsFactory = claimsFactory;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context) {
      // Not doing any change here
      User user = await _userManager.GetUserAsync(context.Subject);
      ClaimsPrincipal principal = await _claimsFactory.CreateAsync(user); 
      context.IssuedClaims = principal.Claims.ToList();
    }

    public async Task IsActiveAsync(IsActiveContext context) {
      User user = await _userManager.GetUserAsync(context.Subject);
      context.IsActive = (user != null) amp;amp; user.Enabled;
    }
    
  }
  

Я полагаю, что ProfileService более полезен, когда не используется Asp.Net Идентификатор ядра?