Применить фильтр действий ко всем действиям контроллера (C # / ASP.NET MVC)
-
20-09-2019 - |
Вопрос
Я создал новый фильтр действий (атрибут, аналогичный [Authorize]), который разрешает доступ к действию контроллера на основе значения сеанса.Тем не менее, я в основном украшаю все действия моего контроллера этим атрибутом (за исключением очень немногих).
Итак, я подумал, что было бы лучше иметь этот Фильтр действий всегда казненный за исключением в случаях, когда я прикрепляю атрибут [ExemptFromAuthorize] к действию контроллера?(Может быть, через наследование моего собственного класса контроллера?)
Как я могу это сделать?
Решение
Бег с джефф3вот ответ, я придумал вот что.Это могло бы потребовать большей проверки на ошибки и надежности, например, действий с несколькими разделителями, но общая идея работает.
В вашем конкретном случае вы могли бы проверить значение сеанса и решить также отказаться от авторизации.
public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
public string Exemption { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.RouteData.GetRequiredString("action") == Exemption)
return;
base.OnAuthorization(filterContext);
}
}
Использование:
[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...
Другие советы
Ознакомьтесь с моей статьей о codeproject -
http://www.codeproject.com/KB/web-security/AuthorizeWithExemptions.aspx
В этой статье я предоставлю вам решение для обеспечения безопасности ASP.NET Контроллеры приложений MVC защищены таким образом, что все действия защищены, за исключением тех, которые вы определяете как небезопасные.
отрывок из кодекса:
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
bool IsUnsecured = action.GetCustomAttributes(
typeof(UnsecuredActionAttribute), true).Count() > 0;
//If doesn't have UnsecuredActionAttribute - then do the authorization
filterContext.HttpContext.SkipAuthorization = IsUnsecured;
base.OnAuthorization(filterContext);
}
Я понимаю, что вопрос довольно устарел, но в любом случае..Если вы хотите применить фильтр ко всем действиям, просто добавьте следующие строки в Global.asax:
protected void Application_Start()
{
// your code here and then
RegisterGlobalFilters(GlobalFilters.Filters);
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyActionFilterAttribute());
}
И в action filter вы можете просто проверить, имеет ли action какие-либо другие атрибуты следующим образом:
public void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
{
// do what you want to do
}
}
Может быть, попробовать и добавить Except
свойство вашего первого атрибута?
[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
public ActionResult Edit()
{
// Protected
}
public ActionResult View()
{
// Accessible by all
}
}
Вы можете добавить атрибут к классу, чтобы он применялся ко всем методам в этом классе
[Authenticate]
public class AccountController : Controller
{
public ActionResult Index()
{
return View();
}
}
Я не знаю, как исключить конкретный метод из атрибута уровня класса.Может быть, использовать отдельный контроллер для не прошедших проверку подлинности запросов?
Для всех, кто читает это в 2013+, MVC4 теперь поддерживает использование [AllowAnonymous]
Вы можете включить авторизацию на контроллере, а затем разрешить анонимность для любых функций, которые вы не хотите разрешать.
Пример:
[Авторизация] HomeController общедоступного класса :Контроллер {
[AllowAnonymous] public ActionResult Index() { }
}
Будет ли это работать с пользовательским фильтром [MyAuthorize] или это работает только с [Authorize]
Для всех, кто читает это в 2013 + году, MVC4 теперь поддерживает использование [AllowAnonymous]
Вы можете включить авторизацию на контроллере, а затем разрешить анонимность для любых функций, которые вы не хотите разрешать.
Пример:
[Authorize]
public class HomeController : Controller
{
[AllowAnonymous]
public ActionResult Index()
{
}
}