#asp.net-core #asp.net-identity
#asp.net-core #asp.net-идентификатор
Вопрос:
Как мне изменить значения идентификатора NameClaimType
и RoleClaimType
на «sub» и «role» вместо приведенных ниже URL-адресов SOAP по умолчанию:
(Подробнее о мотивации этой проблемы на github:https://github.com/GestionSystemesTelecom/fake-authentication-jwtbearer/issues/4 )
Ответ №1:
При создании ClaimsIdentity
класса происходит перегрузка конструктора, которая позволяет указать тип утверждения для имени и роли. Смотрите официальные документы api.
Комментарии:
1. Я использую дополнительную авторизацию при настройке своих служб, и нет возможности передать мой собственный
ClaimsIdentity
экземпляр. Я хочу настроить это в неправильном месте?2. Настроенная вами служба аутентификации фактически отвечает за замену идентификатора afaik. Какой из них вы используете? Исходя из вашей проблемы с GitHub, я бы предположил, что вы звоните
AddAuthentication().AddJwtBearer()
?3. Это правильно. Я просмотрел
AddJwtBearer
параметры и также не смог найти ничего, связанного с настройкой пользовательскогоClaimsIdentity
экземпляра.4.У меня нет настройки, где я мог бы быстро протестировать это, но сработает ли это, если переопределить
TokenValidationParameters
NameClaimType
иRoleClaimType
вAddJwtBearer
?
Ответ №2:
- Настройте свою идентификацию
services.AddDefaultIdentity<IIdentityUser>(options =>
{
options.ClaimsIdentity.UserNameClaimType = "sub";
options.ClaimsIdentity.RoleClaimType = "role";
})
- Настройте свой токен JWT
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters.NameClaimType = "sub";
options.TokenValidationParameters.RoleClaimType = "role";
});
- Используйте
await CreateAsync(user)
метод вIUserClaimsPrincipalFactory<IIdentityUser>
экземпляре. Это создаст правильныйClaimsIdentity
объект с утверждениями пользователя, который вы сможете использовать во время генерации токена JWT.
var principal = await _userClaimsPrincipalFactory.CreateAsync(user);
var token = new JwtSecurityToken(issuer, audience, principal.Claims, notBefore, expires, credentials);
Комментарии:
1. Параметры настройки. TokenValidationParameters.NameClaimType сработал. Спасибо!
Ответ №3:
Чтобы задать пользовательские имена утверждений, используйте приведенный ниже код
services.Configure<IdentityOptions>(options =>
{
options.ClaimsIdentity.UserNameClaimType = "value";
options.ClaimsIdentity.UserIdClaimType = "value";
options.ClaimsIdentity.RoleClaimType = "value";
});
Комментарии:
1. но в моем случае это работает для всех свойств IdentityOptions, таких как [Пользователь, пароль, блокировка], и вообще не изменяет ClaimsIdentity. IdentityServer 4 Core 3.0 Кто-нибудь может помочь?