Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 在ASP.NET核心中使用JWT承载添加声明_Asp.net Core_Claims Based Identity - Fatal编程技术网

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();