将 JWT 自动加载到 User.Identity (ASP.NET Core 3.1)

Posted

技术标签:

【中文标题】将 JWT 自动加载到 User.Identity (ASP.NET Core 3.1)【英文标题】:Load JWT into User.Identity automatically (ASP.NET Core 3.1) 【发布时间】:2020-09-21 16:26:37 【问题描述】:

我正在从事一个具有微服务架构的项目。我有一个 API Rest 作为 API 网关,我想从 JSON Web 令牌中获取用户名。可能需要注意的是,系统的身份验证和授权正在系统的另一部分处理(我只需要获取用户名)。

到目前为止,我能够使用 HttpContext 的这个扩展从 JWT 获取用户名:

public static class HttpContextExtensions

    private static JwtSecurityToken GetJwt(this HttpContext httpContext)
    
        bool existeToken = httpContext.Request.Headers.TryGetValue("Authorization", out StringValues authorizationValue);
        if (!existeToken)
        
            return null;
        
        string encodedToken = authorizationValue.FirstOrDefault().Split(" ", 2)[1];
        return new JwtSecurityTokenHandler().ReadJwtToken(encodedToken);
    
    public static string GetUsername(this HttpContext httpContext)
    
        JwtSecurityToken jwt = httpContext.GetJwt();
        Claim usernameClaim = jwt.Claims.FirstOrDefault(c => c.Type == "preferred_username");
        return usernameClaim?.Value;
    

然后我可以在控制器上获取用户名:

string username = HttpContext.GetUsername();

我想知道在 .Net Core 3.1 上是否有更优雅的方法来执行此操作。我尝试配置我的项目,以便可以在控制器的操作中将所有声明加载到 User.Identity 中,但我失败了。我找到的所有文档都是关于以前版本的 .Net Core。

我想我可能在 Startup.cs 上做错了什么。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

【参考方案1】:

我通过在中间件中填充 HttpContext 上的用户来做了一个方法:

public class AuthMiddleware

    private readonly RequestDelegate _next;

    public AuthMiddleware(RequestDelegate next)
    
        _next = next;
    

    public Task Invoke(HttpContext context)
    
        string authHeader = context.Request.Headers["Authorization"];

        if (authHeader != null)
        
            
            var jwtEncodedString = authHeader.Substring(7);

            var token = new JwtSecurityToken(jwtEncodedString: jwtEncodedString);

            var identity = new ClaimsIdentity(token.Claims, "basic");
            context.User = new ClaimsPrincipal(identity);
        

        return _next(context);
    

然后是应用设置;

public static IApplicationBuilder UseApiConfiguration(this IApplicationBuilder app, IWebHostEnvironment env)

     // add middleware reference
     app.UseMiddleware<AuthMiddleware>();
     
     return app;

【讨论】:

以上是关于将 JWT 自动加载到 User.Identity (ASP.NET Core 3.1)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JWT Token 管理用户身份?

VS 2008 迁移到 VS 2013 时出现 User.Identity.Name 为空的情况

使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false

profile.User.Identity.IsAuthenticated 返回 false 没有人帮助我

如何获得当前用户,以及如何使用User类的MVC5

使用 .mapuniquejsonkey 时,@context.user.identity.name 为空