使用MVC的AuthorizeAttribute与多组角色?

时间:2011-05-31 19:21:28

标签: asp.net-mvc asp.net-mvc-2 authentication authorization

我想要做的是对动作处理程序进行两级角色检查。例如,要求用户至少属于以下一个组:至少以下一个组中的SysAdmins,Managers AND :HR,Payroll,Executive。

最初的猜测是,这可能是这样做的方法,但我认为不是:

[Authorize(Role="SysAdmins,Managers")]
[Authorize(Role="HR,Payroll,Executive")]
public ActionResult SomeAction()
{
    [...]
}

我是否需要将自己的自定义属性作为角色来接受Role1和Role2或类似的东西?或者有更简单/更好的方法吗?

2 个答案:

答案 0 :(得分:8)

您需要自己的属性。这是我的:

public class AuthorizationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var portalModel = ContextCache<PortalModel>.Get(ContextCache.PortalModelSessionCache);

        var requestedController = filterContext.RouteData.GetRequiredString("controller");
        var requestedAction = filterContext.RouteData.GetRequiredString("action");

        var operation = string.Format("/{0}/{1}", requestedController, requestedAction);

        var authorizationService = IoC.Container.Resolve<IAuthorizationService>();

        if (!authorizationService.IsAllowed(AccountController.GetUserFromSession(), operation))
        {
            filterContext.Controller.ViewData["Message"] = string.Format("You are not authorized to perform operation: {0}", operation);
            filterContext.HttpContext.Response.Redirect("/Error/NoAccess");
        }
        else
        {
        }

    }

}

答案 1 :(得分:2)

没有内置的方法可以做你想要的。您将要么必须编写自己的新属性,要么在操作中添加检查,如果用户的角色未通过检查,则返回UnauthorizedActionResult。