Не уверен, почему мой токен недействителен. Я извлекаю его с помощью Postman, вызывающего login (), а затем вставляю его в JWT.io, где написано «недопустимая подпись». Я могу вставить свой секретный ключ в JWT.io, и он будет проверен, но это не так, потому что затем он изменяет маркер к чему-то другому, то, что мой метод входа возвращает пользователю! Вот мой токен и секретный ключ "Супер секретный ключ". Маркер becaomes действителен при вставке в JWT.io
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIxIiwidW5pcXVlX25hbWUiOiJjaHVjayIsInJvbGUiOlsiTWVtYmVyIiwiQWRtaW4iXSwibmJmIjoxNTc5MTU5NDQ0LCJleHAiOjE1NzkyNDU4NDQsImlhdCI6MTU3OTE1OTQ0NH0.Uau2W66y7Kdj01MQbBeoOXiwVzQJSDMEZnbQc2jt1qUyfdc9N5bsla1VGMPHQPjRAcnKSfY3NwQBhCRE-SHZCQ
Вот где я вставляю свой секретный ключ для проверки маркера
Затем я создаю новый запрос получения почтальона, чтобы получить некоторые значения, и использую токен, отправленный обратно из логина. Но я получаю 401 Несанкционированный.
Я добавил токен (тот же, который мне прислал логин, а не измененный после того, как я его проверил) в почтальоне, как это
Я также добавил " IdentityModelEventSource.ShowPII = true; " в файл запуска, чтобы показать дополнительную отладку и вот что я вижу в консоли отладки.
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler 1 Не удалось проверить токен. Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Ошибка проверки подписи. Ключи пробовали: «Microsoft.IdentityModel.Tokens.SymmetricSecurityKey, KeyId:». Выявленные исключения: ''. токен: '{"alg": "HS512", "typ": "JWT"}. {"nameid": "1", "unique_name": "chuck", "role": ["Member", "Admin" ], "nbf": 1579159444, "exp": 1579245844, "iat": 1579159444} '.
Я могу вставить свой код генерации токена, если будет предложено. Любое объяснение в понимании того, что здесь происходит, будет высоко ценится. Вопросы - я пропустил шаг? Предоставляю ли я тот же токен, который логин отправляет мне обратно авторизованному методу контроллера или измененному токену (пробовал оба)?
Вот код, который я использую для создания токена.
private async Task<string> GenerateJwtToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
var key = new SymmetricSecurityKey(Encoding.UTF8
.GetBytes(_config.GetSection("AppSettings:Token").Value));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}