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

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

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

Bearer error = \ "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
            };
        });

И вот как я настроил в configure в 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);
}

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

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

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

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

0 голосов
/ 05 мая 2020

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

...