Один из способов, которые я делал ранее, - это создание фильтра действий, который наследуется от атрибута AuthorizeAttribute.Фильтр может называться как-то типа DisplayIfAuthorizedAttribute, и в дополнение к стандартным свойствам AuthorizeAttribute имеет свойство ViewNameIfNotAuthorized.
Атрибут вызывает базовый метод для авторизации, а в случае сбоя возвращает представление ViewNameIfNotAuthorized.В противном случае, он позволяет методу действия действовать нормально.
Затем вы должны визуализировать эти частичные представления с помощью методов действия и вызывать методы действия с помощью Html.RenderAction или Html.Action в родительском представлении.Эти методы действия будут украшены атрибутом.
Теперь у вас есть стандартизированный способ сделать это, и нет кода авторизации, загрязняющего внутренние компоненты ваших действий.
Вот как будет выглядеть фильтр:
public class DisplayIfAuthorizedAttribute : System.Web.Mvc.AuthorizeAttribute
{
private string _ViewNameIfNotAuthorized;
public DisplayIfAuthorizedAttribute(string viewNameIfNotAuthorized = null)
{
_ViewNameIfNotAuthorized = viewNameIfNotAuthorized;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool isAuthorized = base.AuthorizeCore(filterContext.HttpContext);
if (!isAuthorized)
{
filterContext.Result = GetFailedResult();
}
}
private ActionResult GetFailedResult()
{
if (!String.IsNullOrEmpty(_ViewNameIfNotAuthorized))
{
return new ViewResult { ViewName = _ViewNameIfNotAuthorized };
}
else
return new EmptyResult();
}
}
Ваш метод действия будет украшен как:
[DisplayIfAuthorized("EmptyView", Roles="Admin")]
public ViewResult CreateLink()
{
return View("CreateLink");
}