簡體   English   中英

將 JWT 自動加載到 User.Identity (ASP.NET Core 3.1)

[英]Load JWT into User.Identity automatically (ASP.NET Core 3.1)

我正在開發一個具有微服務架構的項目。 I have one API Rest that works as an API Gateway where I want to get the username from a 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 上是否有更優雅的方法來執行此操作。 我嘗試配置我的項目,以便可以在控制器的操作中將所有聲明加載到 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM