.NETCore 中的 OverrideAuthorization 属性

Pra*_*vin 9 c# asp.net-core-mvc .net-core asp.net-core-2.0

在下面的控制器代码中,GetData()由于控制器级别的原因,只有处于“管理员”角色的用户才能访问操作方法AuthorizeAttribute。但我也希望只有“经理”角色的用户能够访问GetData()操作方法。

[Authorize(Roles = "Administrator")]
Public class AdminController : Controller
{
    [Authorize(Roles = "Administrator, Manager")]
    public IActionResult GetData()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

.NET Core 框架中是否有类似 OverrideAuthorization 属性的选项来实现此要求?

Pra*_*vin 5

经过对授权程序集的长时间分析,能够找到解决方案。

在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);
            }));

        });
Run Code Online (Sandbox Code Playgroud)

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

public class AdminManagerAuthorizationOverrideOthers : RolesAuthorizationRequirement
{
    public AdminManagerAuthorizationOverrideOthers(IEnumerable<string> allowedRoles) : base(allowedRoles)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    [Authorize(Policy = "AdminManager")]
    public IActionResult AdministratorOnly()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


Win*_*Win 3

理想情况下,您希望缩小对操作方法的限制,因为在控制器初始化步骤中,它首先检查控制器的授权过滤器,然后再检查操作过滤器。

[Authorize(Roles = "Administrator, Manager")]
Public class AdminController : Controller
{
    public IActionResult GetData()
    {
    }

    [Authorize(Roles = "Administrator")]
    public IActionResult AdministratorOnly()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的。但是应该有某种方法可以覆盖 .NET core 中的控制器级别授权,这就是我正在寻找的答案。在 .NET 4.6 中,有 OverrideAuthorization 属性来执行此操作。但 .NET Core 没有这个,我正在检查是否有解决方法。 (2认同)