【发布时间】: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