owin - 令牌验证后更新对委托人的声明
问题描述
我有使用 JWTBearerAuthentication 的 API。从身份验证的角度来看,一切正常。但是,验证完成后需要更新主体上的声明。我必须获取一些信息,而不是从源(令牌)声明中接收。我在想是否有一种方法可以在验证成功后向现有声明身份/主体添加一些声明以执行一些访问权限。以下是我的启动课程中的示例代码。
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;
}
}
});
解决方案
您有几个选项可以在身份验证后修改声明:
一种选择是
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>();
推荐阅读
- javascript - 这个斐波那契实例中的原始 num2 是如何更新的?
- performance - 根据 gtmetrix,我的网站速度性能失败,我该如何改进它
- drupal - Drupal Commerce 为购物车添加折扣规则
- laravel - 用户个人资料图片无法在 laravel 8 中显示
- jenkins - 如何在 Jenkins 中使用 Active Choice 参数根据先前的选择输入文本或字符串值
- html - 合并 HTML 和 CSS
- vb.net - 线程的Backgroundworker替代方案 - 更少的CPU使用率?
- python - Odoo 14上传xml文件
- node.js - Axios 帖子未在 AWS lambda 函数上调用
- javascript - Material ui textfield Input type="date" 在 Safari 上不起作用