JwtBearer Auth с хранилищем ключей Azure
Я хотел использовать хранилище ключей Azure для хранения ключа, который будет использоваться для создания подписи для JwtTokens, сгенерированных моим API.
Для аутентификации токена JWT я использую Microsoft.AspNet.Authentication.JwtBearer и настроил его так:
app.UseJwtBearerAuthentication(options =>
{
options.TokenValidationParameters.IssuerSigningKey = this.tokenAuthKey;
options.TokenValidationParameters.ValidAudience = this.tokenOptions.Audience;
options.TokenValidationParameters.ValidIssuer = this.tokenOptions.Issuer;
options.TokenValidationParameters.ValidateSignature = true;
options.TokenValidationParameters.ValidateLifetime = false;
options.TokenValidationParameters.ClockSkew = TimeSpan.FromMinutes(0);
});
Итак, как вы видите, эта конфигурация требует предоставления полного ключа с частной частью (свойство IssureSigningKey). Он отлично работает, когда мой ключ хранится незащищенным в файле XML, где-то в файловой системе, и я просто загружаю его во время запуска приложения. Однако при попытке сохранить ключ в хранилище ключей Azure (AKV) возникает проблема. Поскольку AKV позволяет вывести только открытую часть ключа, я изо всех сил стараюсь заставить все это работать вместе.
Я обнаружил, что класс TokenValidationParameters имеет свойство делегата, которое я могу использовать, чтобы предоставить свой собственный метод валидатора, который будет использовать методы шифрования / дешифрования AKV, чтобы определить, действительна ли подпись.
Проблема в том, что я не могу определить, как указать свой собственный метод, который будет генерировать часть подписи токена JWT, поэтому для конфигурации Microsoft.AspNet.Authentication.JwtBearer не потребуется закрытый ключ.
Мой вопрос: возможно ли как-то указать мой собственный метод, который создает подпись для сгенерированного токена JWT в конфигурации JwtBearer или во время создания токена с использованием JwtSecurityTokenHandler.CreateToken?