gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:02:32 25 4
gpt4 key购买 nike

我正在从事一个采用微服务架构的项目。我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com