如何使用 JWT Bearer 令牌获取用户声明
Posted
技术标签:
【中文标题】如何使用 JWT Bearer 令牌获取用户声明【英文标题】:How to get user claims by using JWT Bearer token 【发布时间】:2019-06-22 16:29:23 【问题描述】:我正在从 Postman 的标头中发送 Bearer Token。现在我需要使用该不记名令牌在 API 中获取用户声明。我尝试的代码不起作用意味着没有获取用户名/电子邮件。如何使用 Bearer Token 获取用户声明?
public class RepositoryUserAccount : IRepositoryUserAccount
private readonly HttpContext _httpContext;
public RepositoryUserAccount(IHttpContextAccessor httpContextAccessor)
this._httpContext = httpContextAccessor.HttpContext;
public async Task EnableAuthenticator()
ClaimsPrincipal currentUser = _httpContext.User;
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
【问题讨论】:
@RayanWilson 我的意思是没有得到像姓名/电子邮件这样的用户声明...... 这是怎么注册的?单例还是传递?您的身份验证提供程序设置为什么? @Daniel Singleton。身份验证提供程序设置????_httpContext
将为空或只是第一个请求命中。将其更改为在方法中使用访问器。
@Chandan Y S 您在登录用户时是否在令牌中设置用户声明?
【参考方案1】:
假设System.Security.Claims.ClaimTypes
是身份验证
var claims = _httpContext.User.Claims.Where(x => x.Type == ClaimTypes.Authentication);
foreach (var claim in claims)
var value = claim.Value; //<= the value of each claim
【讨论】:
【参考方案2】:如您的评论所述,您正在将其注册为单例。重构此类以每次使用IHttpContextAccessor
或将其更改为传递依赖项。
这是第一种方法:
public class RepositoryUserAccount : IRepositoryUserAccount
private readonly IHttpContextAccessor _httpContextAccessor;
public RepositoryUserAccount(IHttpContextAccessor httpContextAccessor)
_httpContextAccessor = httpContextAccessor;
public async Task EnableAuthenticator()
ClaimsPrincipal currentUser = _httpContextAccessor.HttpContext.User;
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
【讨论】:
【参考方案3】:我所做的是,在启动时我配置了类似的服务,
var key = Encoding.ASCII.GetBytes(SECRET_KEY);
services.AddAuthentication(x =>
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, x =>
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
;
);
在我喜欢的控制器中,
[HttpGet]
[Route("EnableAuthenticator")]
public void EnableAuthenticator()
var user = HttpContext.User;
在用户中,我们将获得所有索赔。就是这样!
【讨论】:
以上是关于如何使用 JWT Bearer 令牌获取用户声明的主要内容,如果未能解决你的问题,请参考以下文章
使用NodeJS验证包含“Bearer:”的JWT标记字符串
带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息