Мое веб-приложение - это своего рода оболочка для какой-то сторонней службы. Эта сторонняя служба использует аутентификацию на носителе JWT для доступа к своим конечным точкам WebAPI. Токены зашифрованы с помощью алгоритма RS256 (асимметричный).
У меня есть открытый ключ для проверки подписи токенов на моей стороне. Проверить подпись на сайте jwt.io легко (просто вставьте токен и открытый ключ в текстовые поля). Но как мне настроить TokenValidationParameters, чтобы токены проверялись автоматически с использованием указанного открытого ключа?
Фрагмент кода AddAuthentication:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters.ValidateIssuer = true;
options.TokenValidationParameters.ValidIssuer = "iss";
options.TokenValidationParameters.ValidateIssuerSigningKey = true;
options.TokenValidationParameters.IssuerSigningKey = SomeCodeToGenerateSecurityKeyUsingPublicKeyOnly("-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----");
options.TokenValidationParameters.ValidateAudience = false;
options.TokenValidationParameters.ValidateLifetime = true;
options.TokenValidationParameters.ClockSkew = TimeSpan.Zero;
});
services.AddAuthorization(options =>
{
options.AddPolicy("Bearer",
new AuthorizationPolicyBuilder(new string[] { JwtBearerDefaults.AuthenticationScheme })
.RequireAuthenticatedUser()
.Build()
);
});
Я не могу просто использовать класс SymmetricSecurityKey вот так:
options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("..."));
из-за асимметричного шифрования. В этом случае возникает исключение:
IDX10503: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.SymmetricSecurityKey , KeyId:
'.
Exceptions caught:
''.
token: '{"alg":"RS256","typ":"JWT"}....