【问题标题】:signalr core & policy based authorization : resource always null信号器核心和基于策略的授权:资源始终为空
【发布时间】:2019-02-01 06:17:08
【问题描述】:

我正在使用信号器核心及其基于角色的授权。

另一方面,我的 ClientIdHandler 在带有 [Authorize(Policy = "ClientIdPolicy")] 的测试 mvc 控制器中工作得很好,这里是要求的代码:

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 控制器中,基于策略的授权正在运行,但在信号器集线器中不起作用,因为 context.Resource 始终是 null

这是信号器的问题还是我做错了什么?

【问题讨论】:

    标签: asp.net-core signalr asp.net-core-signalr asp.net-authorization


    【解决方案1】:

    确实是here提到的signalr的问题,解决方法是使用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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2021-01-20
      • 2019-12-31
      • 2023-03-25
      • 2020-05-07
      • 2014-09-12
      • 2018-12-28
      • 2021-08-17
      • 2021-05-27
      相关资源
      最近更新 更多