ASP.NET授权属性和管理员用户角色

时间:2011-08-10 15:33:01

标签: asp.net-mvc-3 authorization

使用Authorize属性i可以指定允许访问资源的角色。

[Authorize(Roles="User")]

但是,如果我有管理员用户,允许去任何资源,我需要指定这一个

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

但可能有某种方式我可以说管理员允许去任何地方,而不是在授权属性中指定这个?

所以我的意思是,如果代码中的某个地方( on controller或on action )将是[Authorize(Roles="User")],则意味着管理员角色也可以去那里。

或者我可以动态地将它设置为所有授权角色应用程序何时启动?

有什么想法吗?

更新:

目前我有一个带有授权属性[Authorize(Role="Administrator")]的管理员控制器,我在其他一些属性为[Authorize(Role="User")]的控制器中有一些操作,所以我需要在那里添加"Administrator"如果我没有找不到更好的解决方案。

5 个答案:

答案 0 :(得分:2)

我认为这对你有用。使用AuthorizeAttribute创建自己的基本控制器,然后让其他控制器继承您的基类。

[Authorize(Roles="Admin")]
public class MyFancyController : Controller
{
}

[Authorize(Roles = "TaxPayer")]
public class WizardController : MyFancyController
{
...

在我看来,这很可怕。

您有多少个控制器/操作?如果您稍后忘记这一点怎么办?也许您有一个页面,您不希望管理员访问?

调试代码会变得更难吗?

答案 1 :(得分:2)

[Authorize(Roles = "User, Admin")]
public class PrestamosController : Controller
{
    // controller details
}

答案 2 :(得分:1)

您可以创建自定义过滤器并使用它来装饰您的操作或控制器。 这是一个我用过很多的简单结构:

public class AuthorizationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
            filterContext.Result = new HttpUnauthorizedResult();
            return;
        }

        var actionName = filterContext.ActionDescriptor.ActionName; 
        var controllerName = filterContext.Controller.GetType().Name;

        bool isAuthorized =false;

        // Put your logic here !!!!

        if (!isAuthorized)  {
            filterContext.Result = new HttpUnauthorizedResult();        
            return;
        }
    }
}

您可以阅读更多here

答案 3 :(得分:0)

这就是我所做的:确保在" Admin"角色也在"用户"作用。

答案 4 :(得分:0)

您需要静态角色运行时角色的概念。这是一个简单的例子:

您的角色列表及其级别:

  • 角色:管理员|等级:1
  • 角色:编辑|等级:2
  • 角色:查看器|等级:3

用户及其静态角色(静态角色是您分配给用户的角色):

  • 用户:John |角色:管理员
  • 用户:Sam |角色:编辑
  • 网友:Peter |角色:查看器

在运行时,您通过使用静态角色和角色级别生成运行时角色,具有更高级别角色的用户自动获得较低级别的角色。因此,经过计算,这些用户的运行时角色将是:

  • 用户:John |角色:管理员,编辑,查看者
  • 用户:Sam |角色:编辑,观众
  • 网友:Peter |角色:查看器

然后,你可以简单地使用[Authorize(Roles =“Viewer”)],具有更高权限级别的用户(例如John,Sam)也可以访问它。因为它们在运行时也必须具有Viewer角色。

使用静态角色和运行时角色的关键是静态角色使角色分配更容易。运行时角色使资源授权更容易。