将 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)的主要内容,如果未能解决你的问题,请参考以下文章
VS 2008 迁移到 VS 2013 时出现 User.Identity.Name 为空的情况
使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false