【发布时间】:2020-01-17 11:11:40
【问题描述】:
我正在开发一个 ASP Net Core 2.1 Web API。我已经在我的项目中成功实现了 JWT。授权的一切工作正常。
通常,当我需要用户声明时,我知道我可以这样获得它们(例如电子邮件声明):
var claimsIdentity = User.Identity as ClaimsIdentity;
var emailClaim = claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email);
问题是,我不在从 ControllerBase 类继承的控制器中,所以我没有任何 User 对象或 [Authorize] 属性。
我拥有的是令牌本身。
例如
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbiIsIm5iZiI6MTU2ODYzNjYxMywiZXhwIjoxNTY4NjQ3NDEzLCJpYXQiOjE1Njg2MzY2MTN9.ED9x_AOvkLQqutb09yh3Huyv0ygHp_i3Eli8WG2S9N4
我想直接从令牌中获取声明,因为:
- 我可以访问令牌。
- 我不在 Controller 类中,并且请求没有通过任何
[Authorize]属性,因此也不能使用IHttpContextAccessor。
如何在 ASP Net Core 2.1 中实现这一点?如果有人想看看我如何添加用户声明:
var tokenDescriptor = new SecurityTokenDescriptor
{
Expires = DateTime.UtcNow.AddHours(3),
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, email),
new Claim(ClaimTypes.Email, email)
}),
SigningCredentials = new SigningCredentials(key: new SymmetricSecurityKey(key), algorithm: SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
我位于派生自 IDocumentFilter 的类中(Swagger 类)
【问题讨论】:
-
投票关闭(作为上述的副本)。不是因为这是一个糟糕的问题,而是因为那里的答案正是你所需要的:)
-
是的,这解决了我的问题。谢谢
标签: c# asp.net-core jwt asp.net-core-webapi