Почему я получаю сообщение 401 о несанкционированной работе с JWT в Asp.Net CORE?

Я пытаюсь выполнить аутентификацию пользователя в Asp.net CORE с помощью JsonWebTokens (JWT).

Когда я запускаю метод входа в систему в своем приложении, токен генерируется правильно, но когда я пытаюсь перейти к методу, ограниченному атрибутом [Authorize], я получаю несанкционированную ошибку 401.

Ошибка носителя = \ "invalid_token \", error_description = \ "Подпись недействительна \"

Вот как я настроил метод ConfigureServices в Startup:

services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        }).AddJwtBearer(x =>
        {
            var key = Encoding.ASCII.GetBytes("asdwda1d8a4sd8w4das8d*w8d*asd@#");
            var signingKey = new SymmetricSecurityKey(key);

            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = signingKey,
                ValidAudience = "Audience",
                ValidIssuer= "Issuer",
                ValidateIssuer = false,
                ValidateAudience = false
            };
        });

И вот как я настроил конфигурацию в Startup:

app.UseAuthentication();

Это генерация токена в LoginController:

                var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim("UserID", login.IdUsuario.ToString())
                }),
                Expires = DateTime.UtcNow.AddDays(1),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes("asdwda1d8a4sd8w4das8d*w8d*asd@#")), 
            SecurityAlgorithms.HmacSha256Signature)
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var securityToken = tokenHandler.CreateToken(tokenDescriptor);
            var token = tokenHandler.WriteToken(securityToken);

            return Ok( new { token } );

И это класс, который я ограничил, он же запрещает доступ

[HttpGet]
[Authorize]
[Route("Profile")]
public IActionResult Profile()
{
     string userID = User.Claims.First(c => c.Type == "UserID").Value;
     var resultado = _UsuarioServicio.Profile(int.Parse(userID));
     return Ok(resultado);
}

Я тестирую это с почтальоном и уже добавил соответствующий заголовок.

Большое спасибо за то, что нашли время взглянуть на это!


person James    schedule 05.05.2020    source источник
comment
вы пробовали добавить слово на предъявителя перед своим токеном в заголовке?   -  person xray    schedule 05.05.2020
comment
@xray ошибка говорит о том, что подпись недействительна, что означает, что токен поступает на сервер, но у него нет действительной подписи. Здесь ключи не совпадают, если внимательно посмотреть на код.   -  person Prateek Kumar Dalbehera    schedule 05.05.2020
comment
Что @PrateekKumarDalbehera Я считаю, что это идет в правильном направлении. Я думаю, он говорит о: SymmetricSecurityKey (Encoding.UTF8.GetBytes (1234567890123456), который отличается от того, что находится в configureservices   -  person Sebastian Inones    schedule 05.05.2020
comment
Привет, спасибо, что спросили!   -  person James    schedule 05.05.2020
comment
Я уже поставил ту же подпись, что и при запуске контроллера, но ошибка продолжается, и да, добавьте слово Bearer перед токеном на тесте   -  person James    schedule 05.05.2020


Ответы (2)


key в вашем токене не соответствует тому, что вы устанавливаете в конфигурации. Они должны идеально совпадать.

person bolkay    schedule 05.05.2020
comment
Привет, спасибо за ответ! Я уже поставил ту же подпись, что и при запуске контроллера, но ошибка продолжается - person James; 05.05.2020
comment
Вам следует отредактировать свой вопрос вместо того, чтобы публиковать ответ. Измените алгоритм подписи на Hmac256. - person bolkay; 05.05.2020
comment
Эй, спасибо за совет! Я уже сделал это, я также продолжаю ставить HmacSha256 вместо HmacSha256Signature, но ошибка продолжается - person James; 05.05.2020

Пожалуйста, используйте один и тот же симметричный ключ при создании и проверке токена. Из кода, которым вы поделились, при генерации токена вы используете ключи подписи как «1234 ..», но при проверке в startup.cs вы используете «ab de ..». Вот почему он жалуется, что подпись недействительна, поскольку оба ключа не совпадают.

Кроме того, сохраните ключи в защищенном файле конфигурации. Если это в реальном времени, используйте асимметричные ключи (открытый ключ и закрытый ключ)

person Prateek Kumar Dalbehera    schedule 05.05.2020
comment
Привет, спасибо за ответ! Я уже поставил ту же подпись, что и при запуске контроллера, но ошибка продолжается - person James; 05.05.2020