web-dev-qa-db-ja.com

トークンから直接JWTクレームを取得ASP Net Core 2.1

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変数は文字列であり、toke自体を表します。

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

ありがとう

6
G.Dimov

たとえば、私の現在のプロジェクトでは、検証によってクレームを取得しています。その更新トークンのため、[Authorize]属性を使用できません。

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

その後

var claims = ValidateRefreshToken(refreshToken);
...
var userIdString = claims.Claims.FirstOrDefault(x => x.Type == "userId")?.Value;
1
Victor Trusov