复杂角色授权Asp.net核心MVC

时间:2019-06-21 12:10:50

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

我编写了以下代码来处理授权。使用authorize属性可以提供访问权限或无法访问。我的问题是:是否存在一种处理部分访问的标准方法,其中某些用户可以根据角色在以下 if语句中显示的权限访问所有内容,而另一些用户可以访问少量资源? 像下面这样写 if else block 似乎对我来说不合适吗?请提出是否还有更好的方法。

 [Authorize(Roles ="admin,superadmin")]
   public async Task<IActionResult> Index()
   {
           if (User.IsInRole("superadmin"))
            {
                //get all groups
            }
            else
            {
              //get only groups that the user belong to
            }

   }

根据此讨论进行了更新(解决方案):我添加了以下代码来处理我的情况。欢迎任何意见或建议。

public class SuperAdminUsersRequirement : IAuthorizationRequirement
    {
        public SuperAdminUsersRequirement(params string[] roles)
        {
            AllowedRoles = roles;
        }
        public string[] AllowedRoles { get; set; }
    }
    public class SuperAdminAuthorizationHander : AuthorizationHandler<SuperAdminUsersRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SuperAdminUsersRequirement requirement)
        {
            if(UserIsAllowed(context, requirement))
            {
                context.Succeed(requirement);
            }
            else
            {
                context.Fail();
            }
            return Task.CompletedTask;
        }

        private bool  UserIsAllowed(AuthorizationHandlerContext context, SuperAdminUsersRequirement requirement)
        {
            if (context.User.Claims != null)
            {
                var claims = from userClaims in context.User.Claims
                             where userClaims.Type == ClaimTypes.Role
                             select userClaims.Value;
                if (requirement.AllowedRoles.Intersect(claims, StringComparer.OrdinalIgnoreCase).Any())
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }
            else
            {
                return false;
            }
        }
    }

startup.cs:可以配置为添加更多具有所有访问权限的角色

services.AddAuthorization(options =>
            {
                options.AddPolicy("HasAllAccess", policy =>
                    policy.Requirements.Add(new SuperAdminUsersRequirement(AdminRole.SUPER_ADMIN.ToString()
                        )));
            });

controller.cs

var authorizationResult = await _authorizationService.AuthorizeAsync(User, "HasAllAccess");

 if(authorizationResult.Succeeded)
            {
 //fetch everything
    }
else
{
  // fetch partial data
}

1 个答案:

答案 0 :(得分:1)

Resource-based authorization in ASP.NET Core有很多代码示例:

https://andrewlock.net/resource-specific-authorisation-in-asp-net-core/

https://github.com/MicrosoftDocs/architecture-center/blob/master/docs/multitenant-identity/authorize.md

根据您的要求,修改HandleRequirementAsync中继承自AuthorizationHandler的{​​{1}}中的AuthorizationHandler<YourRequirement, ResourceName>功能,您应该根据您的要求检查用户是否具有正确的角色/角色:

if (context.User.HasClaim(ClaimTypes.Role, Roles.SurveyAdmin))
{
    context.Succeed(requirement);
    return Task.FromResult(0);
}

或:

if (context.User.IsInRole("super_user"))
{
    context.Succeed(requirement);
    return Task.FromResult(0);
}