ядро сигнализатора и авторизация на основе политик: ресурс всегда нулевой - PullRequest
0 голосов
/ 31 января 2019

Я использую ядро ​​сигнализатора и работаю с авторизацией на основе ролей.

С другой стороны, мой ClientIdHandler работает нормально в тестовом контроллере MVC с [Authorize(Policy = "ClientIdPolicy")], вот код требования:

public class ClientIdHandler : AuthorizationHandler<ClientIdRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   ClientIdRequirement requirement)
    {
        if (!(context.Resource is AuthorizationFilterContext resource) || resource.HttpContext == null
            || resource.HttpContext.Request == null || resource.HttpContext.Request.Headers == null) return Task.CompletedTask;

        bool success = resource.HttpContext.Request.Headers.TryGetValue("ClientId", out var clientIdValue);
        if (!success) return Task.CompletedTask;

        if (!requirement.ClientIds.Contains(clientIdValue.ToString())) return Task.CompletedTask;

        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

В контроллере mvc работает авторизация на основе политик, но НЕ в хабе signalr, поскольку context.Resource всегда null.

Это проблема с сигнализатором илия делаю что-то не так?

1 Ответ

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

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

, вот новый код ClientIdHandler, который работал вконтроллер mvc и концентратор сигналов:

public class ClientIdHandler : AuthorizationHandler<ClientIdRequirement>
{
    private readonly IHttpContextAccessor _contextAccessor = null;

    public ClientIdHandler(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   ClientIdRequirement requirement)
    {
        if (_contextAccessor.HttpContext == null
            || _contextAccessor.HttpContext.Request == null || _contextAccessor.HttpContext.Request.Headers == null) return Task.CompletedTask;

        bool success = _contextAccessor.HttpContext.Request.Headers.TryGetValue("ClientId", out var clientIdValue);
        if (!success) return Task.CompletedTask;

        if (!requirement.ClientIds.Contains(clientIdValue.ToString())) return Task.CompletedTask;

        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}
...