Я предполагаю, что вы используете Asymmetric Keys
. Обычно информация открытого ключа автоматически извлекается из документа обнаружения. Если вам нужно указать его вручную, вам нужно получить ключевые параметры и создать объект SecurityKey. Вы можете обратиться к ссылкам belwo для примеров кода:
https://github.com/IdentityServer/IdentityServer4/blob/master/samples/Clients/src/MvcManual/Controllers/HomeController.cs#L148
Проверка JWT, подписанного с помощью алгоритма RS256, с использованием открытого ключа в C #
Youтакже можно записать пользовательский JwtSecurityTokenHandler
в System.IdentityModel.Tokens.Jwt package
и переопределить событие ValidateToken
для реализации пользовательской логики проверки.
Вы также можете не использовать промежуточное ПО AddJwtBearer
, пример кода такой жекак выше , создайте свои ключи и применитесь к проверке.
Обычно процесс проверки токена noraml:
- Декодирование токена
- Проверка заявок (эмитент, аудитория, время истечения ...)
- Проверить подпись
- Создание пользователя и войти в систему пользователя
Обновлено:
Вы также можете добавить свою собственную проверку подписи вПараметры TokenValidation:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
SignatureValidator =
delegate (string token, TokenValidationParameters parameters)
{
var jwt = new JwtSecurityToken(token);
var httpClient = new HttpClient();
var requestData = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("xxxxxx"),
};
//pass toekn to your endpoint and check result
if (false)
{
throw new Exception("Token signature validation failed.");
}
return jwt;
}
};
});