【问题标题】:How to access current HttpContext in ASP.NET Core 2 Custom Policy-Based Authorization with AuthorizationHandlerContext如何使用 AuthorizationHandlerContext 在 ASP.NET Core 2 自定义基于策略的授权中访问当前的 HttpContext
【发布时间】:2017-12-14 09:00:59
【问题描述】:

如何访问当前 HttpContext 以检查 ASP.NET Core 2 中基于自定义策略的授权的 AuthorizationHandlerContext 中的路由和参数?

参考示例:Custom Policy-Based Authorization

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-2.0


    【解决方案1】:

    您应该将IHttpContextAccessor 的实例注入您的AuthorizationHandler

    在您的 example 的上下文中,这可能如下所示:

    public class BadgeEntryHandler : AuthorizationHandler<EnterBuildingRequirement>
    {
        IHttpContextAccessor _httpContextAccessor = null;
    
        public BadgeEntryHandler(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
    
        protected override Task HandleRequirementAsync(
            AuthorizationContext context, 
            EnterBuildingRequirement requirement)
        {
            HttpContext httpContext = _httpContextAccessor.HttpContext; // Access context here
    
            if (context.User.HasClaim(c => c.Type == ClaimTypes.BadgeId &&
                                           c.Issuer == "http://microsoftsecurity"))
            {
                context.Succeed(requirement);
                return Task.FromResult(0);
            }
        }
    }
    

    您可能需要在您的 DI 设置中注册它(如果您的依赖项之一尚未注册),如下所示:

    services.AddHttpContextAccessor();
    

    【讨论】:

    • 好的,什么是提取 HTTP GET 参数(从路由,如 route="/api/customers/{customerGuid}" )而不从 HttpContext 手动解析字符串路径的最佳方法?发送
    • @HrvojeKusulja:参数值在这个阶段没有被绑定(即使是IActionContextAccessor)。您可能需要做一些与这篇文章中详述的内容类似的事情 - How to get params from AuthrizationHandler .net core。这个答案的作者是微软的 ASP.NET 安全人员,所以很权威。自从这篇文章以来,事情是否已经发生了变化,我无法确定。注意:我已经更新了我的帖子,详细介绍了 DI 注册(可能需要)。
    【解决方案2】:

    您可以将IHttpContextAccessor 注入到您的AuthorizationHandlers 构造函数中。

    例如

    public class MyAuthorizationHandler : AuthorizationHandler<MyRequirement>
    {
        private IHttpContextAccessor _contextAccessor;
    
        public MyAuthorizationHandler (IHttpContextAccessor contextAccessor)
        {
            _contextAccessor = contextAccessor;
        }
    
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
            MinimumPermissionLevelRequirement requirement) {
    
            var httpContext = _contextAccessor.HttpContext;
            // do things
        }
    }
    

    【讨论】:

      【解决方案3】:

      无需注入,简单的解决方案!

      protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
              {
                      var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
                      var httpContext = authFilterCtx.HttpContext;  
              }
      

      【讨论】:

      • 它对我不起作用。 System.InvalidCastException: 'Unable to cast object of type 'Microsoft.AspNetCore.Routing.RouteEndpoint' to type 'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext'.'
      • 你找到netcoreapp3.0的有效解决方案了吗?
      【解决方案4】:

      如果是 MVC 上下文,您可以访问 HttpContextRouteData 以及 MVC 从 AuthorizationContext context 提供的所有其他内容:

      var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
      
      if (mvcContext != null)
      {
          // Examine MVC specific things like routing data.
      }
      

      https://jakeydocs.readthedocs.io/en/latest/security/authorization/policies.html#accessing-mvc-request-context-in-handlers

      在 .NET 5 中,您可以使用以下代码:

      if(context.Resource.GetType().FullName == "Microsoft.AspNetCore.Http.DefaultHttpContext")
      {
          var httpContext = context.Resource as Microsoft.AspNetCore.Http.DefaultHttpContext;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 2015-09-23
        相关资源
        最近更新 更多