- Серверная сторона: Ваш метод
GenerateToken()
использует алгоритм RSA для генерации токена JWT, а аутентификация использует HcmaSha256
для проверки токена.
Измените код в TokenController
, как показано ниже:
public string GenerateToken(User user, DateTime expiry)
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
ClaimsIdentity identity = new ClaimsIdentity(new GenericIdentity(user.UserName, "jwt"));
string _issuer = "dp_portal_api";
string _audience = "dp_portal_spa";
string keyName = mykeyname;
var token = new JwtSecurityToken
(
issuer: _issuer,
audience: _audience,
claims: identity.Claims,
expires: expiry,
notBefore: DateTime.UtcNow,
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(mykeyname)),
SecurityAlgorithms.HmacSha256)
);
return tokenHandler.WriteToken(token);
}
- Клиентская сторона: вы хотите сохранить маркерный объект в localStorage. Тем не менее, вы забыли сначала упорядочить объект.
Удалите свой собственный getSavedToken()
и добавьте три вспомогательные функции:
function getSavedToken() {
// return localStorage.getItem("token"); /// remove this line
var token = localStorage.getItem("token");/// get the stored json string
return JSON.parse(token); /// parse token
}
function getSavedAccessToken() {
return getSavedToken().access_token;
}
function saveToken(tokenObj) {
var str = JSON.stringify(tokenObj);
localStorage.setItem("token", str);
return tokenObj;
}
Измените $.ajaxSetup
, как показано ниже:
$.ajaxSetup({
beforeSend: function(xhr) {
if (isUserLoggedIn()) {
/// remove the line below , since we need the access_token only
// xhr.setRequestHeader('Authorization', 'Bearer ' + getSavedToken());
xhr.setRequestHeader('Authorization', 'bearer ' + getSavedAccessToken());
}
}
})
Наконец, измените функцию события клика на:
$('#btLogin').click(function() {
$.ajax({
type: "POST",
url: "/api/token",
data: JSON.stringify({ username: $('#username').val(), password: $('#password').val(), grant_type: "password", client_id: "dp_portal_spa" }),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
success: function (token) {
//localStorage.setItem("token", token); //// remove this line
saveToken(token); /// add this line , since the obj cannot be stored directly
$('#btLoginContainer').hide();
$('#btLogoutContainer').show();
var message = "<p>Token received and saved in local storage under the key 'token'</p>";
message += "<p>Token Value: </p><p style='word-wrap:break-word'>" +JSON.stringify(token) + "</p>";
$('#responseContainer').html(message);
},
failure: handleError
});
});
Это будет работать как положено. Вот скриншот:
![enter image description here](https://i.stack.imgur.com/0IazW.png)