【问题标题】:.netcore override controllerlevel Authorizeattribute on single action method.net 核心覆盖控制器级别的授权属性在单个操作方法上
【发布时间】:2018-01-09 11:17:08
【问题描述】:

在下面的控制器代码中,只有“管理员”角色的用户才能访问 GetData() 操作方法, 因为控制器级别的授权属性。 但我也希望只有“经理”角色的用户能够访问 GetData() 操作方法,如何编写 一个自定义属性?

[Authorize(Roles = "Administrator")]
Pulic class AdminController : Controller
{

[Authorize(Roles = "Administrator, Manager")]
public IActionResult GetData()
{
}

}

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc .net-core


    【解决方案1】:

    总是首先检查类级属性,因此它会拒绝任何不正确的角色。您需要在类级别指定最广泛的访问权限,然后在需要时将其缩小到方法级别:

    [Authorize(Roles = "Administrator, Manager")]
    public class AdminController : Controller
    {
        // no attribute needed here
        public IActionResult GetData()
        {
        }
    
        [Authorize(Roles = "Administrator")]
        public IActionResult RestrictedMethod()
        {
        }
    }
    

    【讨论】:

    • 控制器中的绝大多数动作仅适用于“管理员”角色,所以我正在寻找一个自定义属性来减少动作属性装饰。
    • this answer,它可能提供你需要的东西,但我自己从未尝试过,我什至不知道它是否在.NET Core 中可用。
    • .netcore 中不存在该属性。
    【解决方案2】:

    在startup.cs文件中,添加Authorization如下:

    services.AddAuthorization(options =>
            {
                var roles = new List<string>{ Role.Administrator, Role.Manager};
    
                var requirement =
                    new List<IAuthorizationRequirement> {new AdminManagerAuthorizationOverrideOthers(roles) };
                var sharedAuthentication =
                    new AuthorizationPolicy(requirement,
                        new List<string>());
                options.AddPolicy(name: "AdminManager", policy: sharedAuthentication);
                options.AddPolicy(name: "Administrator", configurePolicy: policy => policy.RequireAssertion(e =>
                {
                    if (e.Resource is AuthorizationFilterContext afc)
                    {
                        var noPolicy = afc.Filters.OfType<AuthorizeFilter>().Any(p =>
                            p.Policy.Requirements.Count == 1 &&
                            p.Policy.Requirements.Single() is AdminManagerAuthorizationOverrideOthers);
                        if (noPolicy)
                            return true;
                    }
                    return e.User.IsInRole(Role.Administrator);
                }));
    
            });
    

    在从“Microsoft.AspNetCore.Authorization.Infrastructure”命名空间继承“RolesAuthorizationRequirement”的任何命名空间中创建一个类,如下所示:

    public class AdminManagerAuthorizationOverrideOthers : RolesAuthorizationRequirement
    {
        public AdminManagerAuthorizationOverrideOthers(IEnumerable<string> allowedRoles) : base(allowedRoles)
        {
        }
    }
    

    然后,如下装饰控制器和动作方法:

    [Authorize(Policy = "Administrator")]
    Public class AdminController : Controller
    {
        public IActionResult GetData()
        {
        }
    
        [Authorize(Policy = "AdminManager")]
        public IActionResult AdministratorOnly()
        {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多