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

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

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

到目前为止,我能够使用 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;
    }
}

然后我可以在 Controller 上获取用户名:

string username = HttpContext.GetUsername();

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

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

最佳答案

我通过在中间件中填充 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;
}

关于c# - 自动将 JWT 加载到 User.Identity (ASP.NET Core 3.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62164939/

相关文章:

c# - 在 C# 中将 HTML 文件分配给 Message.Body

c# - 从文本框中获取多个字符串并将它们输入到检查列表框 C#

c# - 当 mdb 文件有密码时从 .net Access mdb 文件内容

c# - 如何更改 asp.net Core 3 或 Net Core 5 中的默认端口

c# - C#黑白图像处理

java - 如何验证或验证 JWT 签名?

java - Keycloak - 将客户端的 IP 地址添加到 JWT token 的最佳/最简单方法?

asp.net - ASP.Net 中的 JWT token 异常(生命周期验证失败。 token 缺少过期时间。)

c# - 如何使用 Vue.js 和 .NET Core API 设置 Active Directory 身份验证

c# - 如何将图像保存到 Azure Blob 并使用特定字段命名并返回 Blob Url 并将其保存到 .net core 2.2 中的数据库