我编写了以下代码来处理授权。使用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
}
答案 0 :(得分:1)
Resource-based authorization in ASP.NET Core有很多代码示例:
https://andrewlock.net/resource-specific-authorisation-in-asp-net-core/
根据您的要求,修改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);
}