在ASP.NET网站中,是否应为管理员分配多个角色



这个问题真的适用于任何一个网站或企业系统,其中单个用户可以被分配多个角色。

在ASP.NET Identity中,有IdentityUserIdentityRole,其中用户可以具有0个或多个角色。控制器动作由[Authorize(Roles = "roleName")]保护

给定一个具有以下3个简单角色的简单概念系统:

Administrator
Manager
User

一个简单的管理员类型的用户,应该可以访问所有控制器操作:

JoeAdmin

以及以下示例Web API控制器:

public IHttpActionResult GetForUsersAndAbove()
{
//
}
public IHttpActionResult GetForAdminsOnly()
{
//
}

系统是否应设计为:

  1. JoeAdmin只分配一个角色--管理员,或
  2. 是否将JoeAdmin分配给Administrator、Manager和User

我问这个问题的动机是在授权控制器操作时。如果JoeAdmin只被分配了管理员角色,那么根据以下授权属性,他将无法访问GetForUsersAndAbove(),因为他不是用户角色的成员

[Authorize(Roles = "User")]
public IHttpActionResult GetForUsersAndAbove()
...
[Authorize(Roles = "Administrator")]
public IHttpActionResult GetForAdminsOnly()
...

那么问题来了,GetForUsersAndAbove()应该用来装饰吗

[Authorize(Roles = "User, Manager, Administrator")]

以便他可以访问它?

系统是否应该为JoeAdmin分配基本上的所有角色,以便他可以访问所有控制器方法,即使这些方法标记有[Authorize(Roles = "User")]

编辑

如果我使用以下约定进行控制器操作

[Authorize(Roles = "User")]
public IHttpActionResult GetForUsers()

并且,如果JoeAdmin应该访问此方法,他也应该是User角色的成员,这将导致想象中的用户管理屏幕上的UI问题:

这里有一个场景:您是系统的新用户,负责管理用户。您添加一个新用户JaneAdmin,目的是让她可以完全/不受限制地访问系统。您将看到3个复选框:AdministratorManagerUser。如果没有文档指导,您会勾选哪个复选框?如果我设身处地为用户着想,我会直观地勾选"管理员",希望它能提供完全访问权限。我还可以想象当JaneAdmin发现她被锁定在简单的用户级操作之外时的沮丧。因此UI要求所有3个复选框都打勾。。。这满足了系统的授权方面,但造成了较差的用户体验。

那么,人们通常是如何处理这个问题的呢?

你自己回答自己的问题,真的。为用户设置多个角色比在控制器上指定所有可能的角色更容易,因为角色存储在数据库中,可以随时操作,但向控制器中添加角色需要重建和重新部署项目。

此外,并非所有管理员都应该访问所有区域。我见过允许管理员创建用户和修改密码,但不允许查看个人医疗记录的系统。

所以,是的,我非常建议为您的用户分配多个角色——从长远来看,维护这些角色会更容易。

编辑:所以你想要一个可以访问任何地方的超级管理员用户,而不必在所有控制器中特别提及这一点?听起来您需要覆盖AuthorizeAttirbute才能添加管理员角色以始终获得授权。

类似这样的东西:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
// The user is not authorized => no need to go any further
return false;
}

if(httpContext.User.IsInRole("Admin"))
{
return true;
}
return base.AuthorizeCore(httpContext);
}
}

然后用这个新属性装饰你的所有控制器:

[MyAuthorize(Roles = "User")]
public ActionResult MySuperAction()
{
...
}

相关内容

  • 没有找到相关文章

最新更新