直接从令牌ASP Net Core 2.1获取JWT声明

时间:2019-09-16 15:14:27

标签: c# asp.net-core jwt asp.net-core-webapi

我正在研究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

我想直接从令牌中获得索赔,因为:

  1. 我有权使用令牌。
  2. 我不在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类)

编辑:

解决方案

这些行对我有用。 token变量是一个字符串,代表令牌本身。

var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadToken(token) as JwtSecurityToken;
var email = jwtToken.Claims.First(claim => claim.Type == "email").Value;

谢谢

2 个答案:

答案 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;
    }
}