【问题标题】:Is it possible to have a claims authorization with an OR condition like roles?是否可以使用 OR 条件(如角色)进行索赔授权?
【发布时间】:2019-12-05 19:15:39
【问题描述】:

我一直在我的 .net 应用程序中使用角色授权。但是,我正在构建一个演示应用程序并想尝试一下。我总是这样装饰我的控制器,可以授权管理员或具有完全访问权限的用户。

[[Authorize(Roles = "IsApiUserFullAccess", "IsAdmin") ]]

但是,我无法对声明进行同样的处理。在我的创业公司中,我有这两个索赔政策。如何装饰我的控制者或更改这些政策以声明获得我的控制者的授权?

options.AddPolicy("IsApiUserFullAccess", policy => policy.RequireClaim("apiuser.fullaccess", "true"));
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("administrator", "true"));

【问题讨论】:

    标签: c# asp.net-web-api asp.net-core-3.0


    【解决方案1】:

    您可以使用接受 Func 的 RequireAssertion() 方法来完成策略。

    Source

    例子:

    services.AddAuthorization(options =>
    {
        options.AddPolicy("AdminOrFullAccess", policy =>
            policy.RequireAssertion(context =>
                {
                    bool isApiUserFullAccess = context.User.HasClaim(c => ...);
                    bool isAdmin = context.User.IsInRole("ADMIN_ROLE");
                    return isAdmin || isApiUserFullAccess;
                 });                    
    });
    

    【讨论】:

      【解决方案2】:

      一种方法是使用 OR 对用户声明的要求和处理程序构建自定义策略,如下所示:

      // Marker class
      public class HasFullAccessOrAdminRequirement : IAuthorizationRequirement {}
      
      public class HasFullAccessOrAdminHandler 
      : AuthorizationHandler<HasFullAccessOrAdminRequirement>
      {
          protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
              HasFullAccessOrAdminRequirement requirement)
          {
              var user = context.User;
              if (user.HasClaim(...) || user.HasClaim(...))
              {
                  context.Succeed(requirement);
              }
              return Task.CompletedTask;
          }
      }
      

      然后注册:

      options.AddPolicy("AdminOrFullAccess", builder => 
          builder.AddRequirements(new HasFullAccessOrAdminRequirement());
      

      那就用吧:[Authorize("AdminOrFullAccess")]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2019-09-17
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        相关资源
        最近更新 更多