Как заставить AzureAD и пользовательские токены JWT работать параллельно в веб-API? - PullRequest
0 голосов
/ 31 января 2019

Клиент 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 *

Как заставить эти два типа токенов работать бок о бок?

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете попытаться изменить политику по умолчанию для системы авторизации, указав обе схемы аутентификации:

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
    .AddAzureADBearer(options => Configuration.Bind("AzureAd", options))
    .AddJwtBearer("scc", BuildStandardJwtBearerOptions); 

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes(AzureADDefaults.BearerAuthenticationScheme, "scc")
            .Build();
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...