Клиент API использует либо токен JWT, выпущенный самим API (стандарт) или Azure AD.
Когда я включаю ТОЛЬКО пользовательскую (стандартную) аутентификацию на носителе, все работает отлично, без каких-либо проблем.
Кроме того, когда я включаю ТОЛЬКО аутентификацию на носителе Azure AD, все также отлично работает.
Когда я включаю их обоих, один из них перестает работать.
Вотмоя настройка API ядра .Net:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(BuildStandardJwtBearerOptions);
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
private void BuildStandardJwtBearerOptions(JwtBearerOptions options)
{
var settings = GetStandardTokenSettings(null);
options.IncludeErrorDetails = true;
options.RequireHttpsMetadata = false;
options.SaveToken = true;
var signingKeyBytes = Encoding.UTF8.GetBytes(settings.SecretKey);
var signingKey = new SymmetricSecurityKey(signingKeyBytes);
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = settings.Issuer,
ValidAudience = settings.Issuer,
IssuerSigningKey = signingKey
};
}
Вот пример ошибки, когда клиент отправляет токен Azure AD:
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Информация: не удалось проверить токен.
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10500: Ошибка проверки подписи.Ключи безопасности не были предоставлены для проверки подписи.на System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (String знак, TokenValidationParameters validationParameters) в System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (String знак, TokenValidationParameters validationParameters, SecurityToken & validatedToken) в Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync () Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Информация: AzureADJwtBearer не был аутентифицирован.Сообщение об ошибке: IDX10500: Ошибка проверки подписи.Ключи безопасности не были предоставлены для проверки подписи.Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: Маршрут соответствует {action = "List", controller = "Account"}.Выполнение действия BookRental.Api.Controllers.AccountController.List (BookRental.Api) Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: авторизация не удалась.Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: авторизация не выполнена для запроса в фильтре «Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter».Microsoft.AspNetCore.Mvc.ChallengeResult: Информация: Выполнение ChallengeResult со схемами аутентификации ().Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Информация: Схема аутентификации: AzureADJwtBearer подвергся сомнению.Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: выполненное действие BookRental.Api.Controllers.AccountController.List (BookRental.Api) в 7.1108ms Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос выполнен в 16.8394ms 4011017 *
Как заставить эти два типа токенов работать бок о бок?