Asp.net core 在ASP.NET核心中使用JWT承载添加声明
我正在使用Asp.net core 在ASP.NET核心中使用JWT承载添加声明,asp.net-core,claims-based-identity,Asp.net Core,Claims Based Identity,我正在使用AddJwtBearer对我的应用程序使用OAuth/OpenId身份验证机制。我的一个需求是在用户登录(或令牌刷新)后添加一个特定的声明 目前,我使用的是OnTokenValidated事件,但问题是每次请求都会调用它,当我调用数据库来检索我想要添加的声明时,这非常烦人。特别是现在,我需要添加另一个声明,这将需要更多的时间从数据库中检索 我要寻找的是一种仅在身份验证之后添加自定义声明的方法,以避免为每个请求调用数据库 我要寻找的是一种仅在身份验证之后添加自定义声明的方法 您可以使用在
AddJwtBearer
对我的应用程序使用OAuth/OpenId身份验证机制。我的一个需求是在用户登录(或令牌刷新)后添加一个特定的声明
目前,我使用的是OnTokenValidated
事件,但问题是每次请求都会调用它,当我调用数据库来检索我想要添加的声明时,这非常烦人。特别是现在,我需要添加另一个声明,这将需要更多的时间从数据库中检索
我要寻找的是一种仅在身份验证之后添加自定义声明的方法,以避免为每个请求调用数据库
我要寻找的是一种仅在身份验证之后添加自定义声明的方法
您可以使用在验证中间件之后调用的中间件:
UserClaimsMiddleware.cs:
public class UserClaimsMiddleware
{
private readonly RequestDelegate _next;
public UserClaimsMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
if (httpContext.User != null && httpContext.User.Identity.IsAuthenticated)
{
var claims = new List<Claim>
{
new Claim("SomeClaim", "SomeValue")
};
var appIdentity = new ClaimsIdentity(claims);
httpContext.User.AddIdentity(appIdentity);
await _next(httpContext);
}
}
}
public static class UserClaimsMiddlewareExtensions
{
public static IApplicationBuilder UseUserClaims(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<UserClaimsMiddleware>();
}
}
避免为每个请求调用数据库
当服务器端获得带有令牌的API调用时,
AddJwtBearer
将解码令牌、验证令牌并对用户进行身份验证,您可以在OnTokenValidated
或自定义中间件中添加新声明。但是声明不会在下一个api调用中持续,除非您在每个请求上添加声明。Hi,目标基本上是在令牌发送到前端应用程序之前将声明添加到令牌中,这样,新声明将始终存在于令牌中,我不必每次都提取数据。如果我正确理解您的解释,中间件只是一种与OnTokenValidated不同的技术,但将具有相同的效果?@ssougnez,是的,您应该向token添加声明。否则,您需要在每个请求上添加声明。我将立即尝试中间件,但您能否确认中间件将针对每个请求运行,因此它不会解决问题。由于ADFD无法检索到我需要添加的声明,因此基本上没有解决方案将声明添加到令牌中一次?您应该在发布令牌时将声明添加到令牌中。这取决于您使用的身份提供程序。此链接可能有助于:
app.UseAuthentication();
app.UseUserClaims();
app.UseMvc();