Токен .NET Core — JWT — decrypt ? (Утверждает.First возвращает «Последовательность не содержит совпадающего элемента»)

#c# #asp.net-core #jwt #token

#c# #asp.net-core #jwt #токен

Вопрос:

Я отправляю свой токен jwt в качестве заголовка на предъявителя, чтобы он был проверен

теперь я хочу расшифровать токен, чтобы получить идентификатор пользователя, чтобы проверить, какова его роль, и другую информацию

Я подумал, что лучшее место для этого — фильтр промежуточного программного обеспечения

но как мне расшифровать токен?

tokenS.Claims.First возвращает «Последовательность не содержит совпадающего элемента»

 public async void OnAuthorization(AuthorizationFilterContext context)
{
    var req = context.HttpContext.Request;

    //---------------------------------------- jwt
    var stream = req.Headers[HeaderNames.Authorization];
    var tokenHandler = new JwtSecurityTokenHandler();
    var bearer = stream[0].Split(" ");
    var jsonToken = tokenHandler.ReadToken(bearer[1]);
    var tokenS = tokenHandler.ReadToken(stream) as JwtSecurityToken;
    var jti = tokenS.Claims.First(claim => claim.Type == ClaimTypes.Name);
  

вот как я шифрую токен при аутентификации пользователя

 // authentication successful so generate jwt token
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(settings.JwtSecret);
var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new Claim[]
        {
            new Claim(ClaimTypes.Name, user.Id.ToString())
        }),
        Expires = DateTime.UtcNow.AddDays(7),
        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key),SecurityAlgorithms.HmacSha256Signature)
    };
var token = tokenHandler.CreateToken(tokenDescriptor);
  

спасибо, что помогли мне в этом

Ответ №1:

Согласно вашему описанию, я обнаружил, что в вашем методе генерации токена jwt нет эмитента или аудитории, я предлагаю вам попробовать использовать приведенные ниже коды генерации JWT, и тогда это будет работать хорошо.

Метод шифрования:

     public static string GetToken2() {

        var key = Encoding.ASCII.GetBytes
        ("YourKey-2374-OFFKDI940NG7:56753253-tyuw-5769-0921-kfirox29zoxv");
        //Generate Token for user 
        var JWToken = new JwtSecurityToken(
            issuer: "http://localhost:45092/",
            audience: "http://localhost:45092/",
            claims: new List<Claim>
{
    new Claim(ClaimTypes.Name, "Users2222" )
},
            notBefore: new DateTimeOffset(DateTime.Now).DateTime,
            expires: new DateTimeOffset(DateTime.Now.AddDays(1)).DateTime,
            //Using HS256 Algorithm to encrypt Token  
            signingCredentials: new SigningCredentials
            (new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        );
        string token = new JwtSecurityTokenHandler().WriteToken(JWToken);
        return token;
    }
  

Промежуточное программное обеспечение:

         app.Use(async (context, next) =>
        {
            // you could get from token or get from session. 
            string token = context.Request.Headers["Authorization"];
            if (!string.IsNullOrEmpty(token))
            {
                var tok = token.Replace("Bearer ", "");
                var jwttoken = new JwtSecurityTokenHandler().ReadJwtToken(tok);

                 var jti = jwttoken.Claims.First(claim => claim.Type == ClaimTypes.Name);
            }
            await next();

        });
  

Результат:

введите описание изображения здесь