множественная политика aspcore с JWT - PullRequest
0 голосов
/ 08 января 2019

У меня есть две политики: ApiUser и CompanyBased. когда я использую политику, основанную на компании ([Authorize (Policy = "CompanyBased")] ) приложению не удалось проверить токен JWT. Когда я использую [Authorize], он работает хорошо, токен проверяется ...

Версия: ядро ​​2.2

Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [2] Авторизация не удалась. Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [3] Авторизация не выполнена для запроса в фильтре «Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter». Microsoft.AspNetCore.Mvc.ForbidResult [1] Выполнение ForbidResult со схемами аутентификации (). Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [13] Схема аутентификации: предъявитель был запрещен.

        // api user claim policy
        services.AddAuthorization(options =>
        {
            options.AddPolicy("ApiUser", policy => policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, Constants.Strings.JwtClaims.ApiAccess));
            options.AddPolicy("CompanyBased", policy =>
            {
                policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, Constants.Strings.JwtClaims.ApiAccess);
                policy.AddRequirements(new CompanyBasedRequirement());
            });
        });

Это компания BaseHandler

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CompanyBasedRequirement requirement)
{
    #region Validate Company id

    Guid? companyId = _httpContextAccessor.HttpContext.Request.Headers.GetCompanyId();
    string nameIdentifier = context.User.FindFirstValue(ClaimTypes.NameIdentifier);
    if (companyId is null)
    {
        _logger.LogInformation($"No company suppied for {nameIdentifier}");
        context.Fail();
    }
    else
    {
        if (!_clientRepository.IsClientValid(companyId.Value, nameIdentifier))
        {
            _logger.LogInformation($"{companyId} does not belong to {nameIdentifier}");
            context.Fail();
        }
        else
        {
            context.Succeed(requirement);
        }
    }

    #endregion Validate Company id

    return Task.CompletedTask;
}
  1. Как убедиться, что CompanyBased проверяет токен JWT
  2. Могу ли я сделать HandleRequirementAsync Async с помощью await, я застрял с возвратом await Task.CompletedTask (который не работает)!

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Мне не хватало Constants.Strings.JwtClaimIdentifiers.Rol в токене!

0 голосов
/ 08 января 2019

Убедитесь, что вы правильно зарегистрировали свой пользовательский обработчик авторизации в контейнере внедрения зависимостей в классе Startup. Он должен быть зарегистрирован как синглтон:

services.AddSingleton<IAuthorizationHandler, CompanyBasedHandler>();

Вы можете сделать HandleRequirementAsync async / await, изменив сигнатуру метода на async Task, а затем не возвращая завершенную задачу в конце метода, например:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, CompanyBasedRequirement requirement)
{
    #region Validate Company id

    Guid? companyId = _httpContextAccessor.HttpContext.Request.Headers.GetCompanyId();
    string nameIdentifier = context.User.FindFirstValue(ClaimTypes.NameIdentifier);
    if (companyId is null)
    {
        _logger.LogInformation($"No company suppied for {nameIdentifier}");
        context.Fail();
    }
    else
    {
        if (!_clientRepository.IsClientValid(companyId.Value, nameIdentifier))
        {
            _logger.LogInformation($"{companyId} does not belong to {nameIdentifier}");
            context.Fail();
        }
        else
        {
            context.Succeed(requirement);
        }
    }

    #endregion Validate Company id
}

Обратите внимание, что вы не выполняете никаких асинхронных операций в методе, это означает, что он будет выполняться синхронно, поэтому нет необходимости делать этот метод асинхронным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...