#owin #openid #jwt-auth
#owin #OpenID #jwt
Вопрос:
У меня есть API, который использует JWTBearerAuthentication. С точки зрения аутентификации все работает нормально. Однако существует необходимость обновить утверждения для участника после завершения проверки. Есть некоторая информация, которую я должен извлечь вместо получения из исходных (токеновых) претензий. Я подумал, есть ли способ, чтобы после успешной проверки я мог добавить некоторые претензии к существующим удостоверениям / принципалу для выполнения некоторых действий с правами доступа. Ниже приведен пример кода в моем стартовом классе.
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
TokenHandler = new ValidateJwtSecurityTokenHandlerforLogs(_loggingService, _environment),
AuthenticationMode = AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
NameClaimType = JwtClaimTypes.Name,
RoleClaimType = OpenIDConfiguration.Permission,
ValidateAudience = false,
ValidIssuer = authority,
IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) =>
{
var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
return discoveryDocument.SigningKeys;
}
}
});
Ответ №1:
У вас есть несколько вариантов изменения утверждений после аутентификации:
Одним из вариантов является
options.Events = new JwtBearerEvents()
{
OnTokenValidated = context =>
{
// Token has passed validation and a ClaimsIdentity has been generated.
context.Principal.Identities.First().AddClaim(new Claim("VIPCustomer", "YES"));
return Task.CompletedTask;
}
};
Чтобы включить более сложные сценарии преобразования утверждений, мы можем добавить пользовательский класс преобразования
public class BonusLevelClaimTransformation : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
if (!principal.HasClaim(c => c.Type == "bonuslevel"))
{
//Lookup bonus level.....
principal.Identities.First().AddClaim(new Claim("bonuslevel", "12345"));
}
return Task.FromResult(principal);
}
}
Затем мы регистрируем его в Startup.cs:
services.AddTransient<IClaimsTransformation, BonusLevelClaimTransformation>();
Комментарии:
1. По какой-то причине я не могу добавить первый вариант в свой проект MVC. Также второй вариант добавляет претензии, но не сохраняет их. Не уверен, что я чего-то не хватает. Есть ли у вас какой-либо рабочий пример, где это интегрировано.
2. Используете ли вы classic ASP.NET MVC или ASP.NET Ядро? в моем примере используется ASP.NET ядро.