【问题标题】:Bypass authorization and allow admins access to everything in .NET Core 2?绕过授权并允许管理员访问 .NET Core 2 中的所有内容?
【发布时间】:2019-06-18 21:15:14
【问题描述】:

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

考虑这个例子:

[Authorize(Role = "BusinessOwner")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

必须明确设置“管理员”角色。将所有角色添加到管理员用户不是一个选项,因为角色可以(阅读意愿)随时间而变化。

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

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

【问题讨论】:

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


    【解决方案1】:

    我从这个答案中获得了很多灵感:https://stackoverflow.com/a/38773345/3878764

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

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

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

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

    public class AgeRequirementHandler : RequirementHandlerBase<AgeRequirement>
    {
        protected override HandleAsync(AuthorizationHandlerContext context, AgeRequirement requirement)
        {
            ... 
        }
    }
    
    public class AgeRequirement : IRequrement 
    {
        public int MinimumAge { get; set; }
    }
    

    然后像往常一样注册:

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

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

    【讨论】:

      【解决方案2】:

      尝试基于策略的授权。您可以从https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.2 找到一个示例,它非常灵活,可以根据需要使用任何角色和其他属性组合。

      创建策略后,您可以将其应用为全局过滤器。

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddMvc(o =>
          {
              var policy = new AuthorizationPolicyBuilder()
                  .RequireRole("Admin")
                  .Build();
              o.Filters.Add(new AuthorizeFilter(policy));
          });
      }
      

      【讨论】:

      • 如何使用策略而不是到处写[Authorize(Policy = "RequireAdministratorRole")]
      • @maxbeaudoin 我已添加代码示例以可能会回答。应该这样做。
      • 从外观上看,您似乎是“管理员”,或者您什么都不是。
      • 在这种情况下,您需要按照stackoverflow.com/a/56658483/1588156中的说明进行长时间操作
      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2019-07-18
      • 2016-05-01
      相关资源
      最近更新 更多