【问题标题】:Get Controller and Action Name whern creating Custom Authorization Policy in .NET Core 6 using IHttpContextAccessor使用 IHttpContextAccessor 在 .NET Core 6 中创建自定义授权策略时获取控制器和操作名称
【发布时间】:2022-01-25 01:26:50
【问题描述】:

我正在尝试在 .NET Core 6 中使用 Handler 中的以下逻辑配置自定义授权策略:

  1. 获取控制器名称并获取用户尝试访问的控制器操作
  2. 如果 Claim.Type = 控制器名称和值 = 控制器操作,则授予访问权限。

我正在尝试使用注入 Handler 类的 IHttpContextAccessor 访问控制器名称和操作。如何获取控制器名称和操作方法名称?我发现有几篇文章提到了如何在以前版本的 .NET Core 中这样做。但是这些在 .NET 6 上不起作用。它总是提供 NULL 值

当前的 AccessHandler(.NET 的早期版本)

using Microsoft.AspNetCore.Authorization;

namespace myApp.Security
{
    public class AccessHandler : AuthorizationHandler<AccessRequirement>
    {
        private readonly IHttpContextAccessor httpContextAccessor;

        public AccessHandler(IHttpContextAccessor httpContextAccessor)
        {
            this.httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
        }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccessRequirement requirement)
        {
               
            string? controllerName = httpContextAccessor.HttpContext?.Request.Query["controller"].ToString();

            string? actionName = httpContextAccessor.HttpContext?.Request.Query["action"].ToString();

            if (controllerName != null && actionName != null)
            {
                if (context.User.HasClaim(claim => claim.Type == controllerName && claim.Value == actionName))
                {
                    context.Succeed(requirement);
                }
            }

            return Task.CompletedTask;
        }
    }
}

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-mvc .net-6.0


    【解决方案1】:

    终于找到了解决方案,寻找的过程真的很满意。以下是在 .NET 6 Core 中的操作方法。修改需求处理器如下:

    using Microsoft.AspNetCore.Authorization;
    
    namespace myApp.Security
    {
        public class AccessHandler : AuthorizationHandler<AccessRequirement>
        {
            private readonly IHttpContextAccessor httpContextAccessor;
    
            public AccessHandler(IHttpContextAccessor httpContextAccessor)
            {
                this.httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
            }
            protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccessRequirement requirement)
            {
                string? controllerName = httpContextAccessor.HttpContext?.Request.RouteValues["controller"]?.ToString();
    
                string? actionName = httpContextAccessor.HttpContext?.Request.RouteValues["action"]?.ToString();
    
                if (controllerName != null && actionName != null)
                {
                    if (context.User.HasClaim(claim => (claim.Type == controllerName && claim.Value == actionName)))
                    {
                        context.Succeed(requirement);
                    }
                }
    
                return Task.CompletedTask;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2017-08-08
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多