【问题标题】:Load JWT into User.Identity automatically (ASP.NET Core 3.1)将 JWT 自动加载到 User.Identity (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 上做错了什么。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: c# jwt asp.net-core-webapi asp.net-core-3.1


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2020-05-25
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2020-11-02
      • 2020-05-10
      • 2021-04-02
      相关资源
      最近更新 更多