Подобно решениям, предложенным @hellangle и @Andreas, я использовал следующий код для решения этой проблемы:
public class CustomizedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var userAuthInfo = GetUserAuthInfo();
if (!userAuthInfo.IsAuthenticated())
{
filterContext.Result = new RedirectResult(UrlToYourLoginPage);
return;
}
if (!userAuthInfo.IsAuthorized())
{
var result = new ViewResult {ViewName = "UnAuthorized"};
result.ViewBag.Message = "Sorry! You are not authorized to do this!";
filterContext.Result = result;
}
}
}
Конечно, вам необходимо реализовать класс информации об авторизации пользователя и связанные с ним методы (GetUserAuthInfo, IsAuthenticated, IsAuthorized) в соответствии с вашими конкретными потребностями. Кроме того, представление с именем «UnAuthorized» должно быть помещено туда, где может найти движок MVC. Затем его можно использовать в классе контроллера (указан в ответе @ hellangle) или в методе действия:
[CustomizedAuthorizeAttribute]
public class TargetController : Controller
{
[CustomizedAuthorizeAttribute]
public ActionResult TargetAction()
{
// Your Code
}
}
Чтобы обеспечить разную стратегию управления доступом для различных классов контроллеров и методов действий, реализует конструктор для класса CustomizedAuthorizeAttribute, который принимает параметр (ы), представляющий информацию управления доступом, а затем соответствующим образом создает класс CustomizedAuthorizeAttribute.