#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();
});
Результат: