绕过授权并允许管理员访问 .NET Core 2 中的所有内容?

max*_*oin 1 c# asp.net authorization asp.net-core

我想允许具有“管理员”角色的用户隐式访问每个资源。

考虑这个例子:

[Authorize(Role = "BusinessOwner")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

必须明确设置角色“Admin”。将所有角色添加到 admin 用户不是一种选择,因为角色可以(读取意愿)随时间变化。

[Authorize(Role = "Admin, BusinessOwner")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

不建议再创建自定义AuthorizeAttribute,那么在 .NET Core 2 中绕过授权检查并允许管理员访问的最佳实践是什么?

Nee*_*ack 6

我从这个答案中得到了很大的启发:https : //stackoverflow.com/a/38773345/3878764

如果管理员有权访问所有内容,则您无需在每个操作上明确检查此授权逻辑。您只需要检查已经受到限制的操作 - 管理员角色将绕过限制。

因此,例如,如果您使用基于策略的授权,您可以编写一个 Base AuthorizationHandler,如果找到 admin 角色,它将短路逻辑。

public abstract class RequirementHandlerBase<T> : AuthorizationHandler<T> where T : IAuthorizationRequirement
{
    protected sealed override Task HandleRequirementAsync(AuthorizationHandlerContext context, T requirement)
    {            
        //if admin then short-circuit with success
        if (context.User.IsInRole("Admin"))
        {
            context.Succeed(requirement);    
            return Task.FromResult(true);
        }

        return HandleAsync(context, requirement);
    }

    protected abstract Task HandleAsync(AuthorizationHandlerContext context, T requirement);
}
Run Code Online (Sandbox Code Playgroud)

让您的所有处理程序都从基础派生:

public class AgeRequirementHandler : RequirementHandlerBase<AgeRequirement>
{
    protected override HandleAsync(AuthorizationHandlerContext context, AgeRequirement requirement)
    {
        ... 
    }
}

public class AgeRequirement : IRequrement 
{
    public int MinimumAge { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后像往常一样注册:

services.AddAuthorization(options =>
{
    options.AddPolicy("Over18",
                      policy => policy.Requirements.Add(new AgeRequirement { MinimumAge = 18 }));
});
Run Code Online (Sandbox Code Playgroud)

此外,有关基于策略的角色检查的此文档可能很有用:https : //docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view= aspnetcore-2.2#policy-based- role-检查