#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 Идентификатор ядра?