我正在研究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
我想直接从令牌中获得索赔,因为:
[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类)
编辑:
这些行对我有用。 token
变量是一个字符串,代表令牌本身。
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadToken(token) as JwtSecurityToken;
var email = jwtToken.Claims.First(claim => claim.Type == "email").Value;
谢谢
答案 0 :(得分:2)
这是一个简单的解决方法:
static
答案 1 :(得分:1)
例如,在我当前的项目中,我通过验证获得了索赔。它的刷新令牌,所以我不能使用[Authorize]属性。
Step 1/6 : FROM microsoft/dotnet:2.2-sdk as build-env
---> f13ac9d68148
Step 2/6 : RUN dotnet --version
---> Running in f1d34507c7f2
> 2.2.402
Removing intermediate container f1d34507c7f2
---> 7fde8596c331
然后
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
public ClaimsPrincipal ValidateRefreshToken(string refreshToken)
{
try
{
var validationParams = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(tokenSecurityKey),
ValidateLifetime = true
};
return new JwtSecurityTokenHandler().ValidateToken
(
refreshToken,
validationParams,
out SecurityToken token
);
}
catch (Exception e)
{
Log.Error(e.Message);
return null;
}
}