#asp.net-core #jwt
#asp.net-core #jwt
Вопрос:
Я использую asp.net ядро для создания JWT и проблемы с ним.
Мне нужно создать JWT, подобный псевдокоду, приведенному ниже:
var headers = base64URLencode(HeaderData);
var payload = base64URLencode(payloadData);
var headerwithpayload = header "." payload;
var signature = base64URLencode(RSASHA256(headerwithpayload, privateKey));
var encodedJWT = headerwithpayload "." signature;
Для достижения этой цели были созданы общедоступный сертификат X509 (.cer) и частный сертификат (.pfx) с паролем. Алгоритм, используемый для создания JWT, — RS256.
Приведенный ниже код был написан для создания JWT, и когда я проверил JWT с помощью моего общедоступного сертификата в jwt.io , это отображается как действительная подпись. Однако, когда я отправляю его другой команде, которой необходимо обработать мой запрос, я получаю ошибку 401 — Unauthorized.
// Certificate amp; Private Key
string certLocation = @"E:PrivateCert.pfx";
string certPassword = "####";
var colln = new X509Certificate2collection();
colln.Import(certLocation, certPassword, X509KeyStorageFlags.PersistKeySet);
var certificate = colln[0];
var privateKey = certificate.GetRSAPrivateKey();
var privateSecurityKey = new RsaSecurityKey(privateKey);
// Header, Payload amp; Signature
var descriptor = new SecurityTokenDescriptor
{
Issuer = "ClientId",
Audience = "audience",
Expires = DateTime.UtcNow.AddMinutes(10),
Subject = new ClaimsIdentity(new List<Claim> { new Claim("sub", "subject") }),
SigningCredentials = new SigningCredentials(privateSecurityKey, SecurityAlgorithms.RsaSha256)
};
var tokenHandler = new JsonWebTokenHandler();
string jwtValue = tokenHandler.CreateToken(descriptor);
Я понимаю, что я не кодирую JWT во второй раз, используя подпись, которая может быть причиной проблемы.
Как мне:
- Создать закодированный JWT?
- Извлеките закрытый ключ из частного сертификата в виде строки, чтобы я мог создать закодированный JWT точно так же, как в псевдокоде.
Комментарии:
1. Можете ли вы поделиться своим startup.cs? Вы установили
ValidateIssuerSigningKey = true
, и у васIssuerSigningKey
то же самое сprivateSecurityKey
?2. Привет @YiyiYou, я использую JWT только в контроллере. Я буду отправлять JWT другому внешнему API (у которого есть мой общедоступный сертификат) для получения информации. Итак, нужно ли внести какие-либо изменения при запуске? Код в моем вопросе содержит полный код, который я использовал, и я не использовал ValidateIssuerSigningKey
3. Я имею в виду ваш startup.cs в вашем внешнем API. В вашем внешнем API вам нужно установить
IssuerSigningKey
то же самое сprivateSecurityKey
.4. Я не могу внести изменения во внешний API, поскольку он принадлежит другой команде. Кроме того, они используют Java для своей разработки. У них есть общедоступный сертификат X509, который я отправил им для чтения JWT, который я буду отправлять. Итак, все, что мне нужно сделать, это создать JWT, аналогичный псевдокоду, упомянутому в моем вопросе выше.