Использование MVC AuthorizeAttribute с несколькими группами ролей? - PullRequest
3 голосов
/ 31 мая 2011

Я хочу сделать двухуровневую проверку роли в обработчике действий. Например, требуется, чтобы пользователи были хотя бы в одной из следующих групп: SysAdmins, Managers AND хотя бы в одной из следующих групп: HR, Payroll, Executive.

Первоначально предполагалось, что это может быть способ сделать это, но я не думаю, что это так:

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

Нужно ли мне назначать свой собственный Атрибут для использования в Role1 и Role2 или что-то в этом роде? Или есть более простой / лучший способ сделать это?

Ответы [ 2 ]

8 голосов
/ 31 мая 2011

Вам понадобится ваш собственный атрибут. Вот мой:

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
        {
        }

    }

}
2 голосов
/ 31 мая 2011

Нет встроенного способа делать то, что вы хотите. Вам придется либо написать свой собственный новый атрибут, либо добавить проверку внутри действия и вернуть UnauthorizedActionResult, если роль пользователя не прошла проверку.

...