Принудительный фильтр действий для всех действий контроллера (C # / ASP.NET MVC)

Я создал новый фильтр действий (атрибут, аналогичный [Authorize]), который разрешает доступ к действию контроллера на основе значения сеанса. Однако я'Я в основном украшаю все мои действия контроллера с этим атрибутом (за исключением очень немногих).

Итак, я подумал, что было бы лучше иметь этот фильтр действийвсегда выполненныйКроме в случаях, когда я присоединяю атрибут [ExemptFromAuthorize] к действию контроллера? (Может быть, через наследование моего собственного класса Controller?)

Как я могу это сделать?

 Carlos Blanco06 авг. 2013 г., 18:55
Этот вопрос старый и в MVC4 есть новый атрибут с именемAllowAnonymous сделано специально для этого.

Ответы на вопрос(7)

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);
}

кто читает это в 2013+, MVC4 теперь поддерживает использование[AllowAnonymous]

Вы можете поставить Авторизацию на контроллере, а затем Разрешить анонимно для любых функций, которые вы не хотите авторизовать.

Пример:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
Решение Вопроса

jeef3'ответ, я придумал это. Он может использовать больше проверки ошибок и надежности, как несколько действий с разделителями, но общая идея работает.

В вашем конкретном случае вы можете проверить значение сеанса и решить также выйти из авторизации.

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
...

что вопрос довольно устарел, но в любом случае ... Если вы хотите применить фильтр ко всем действиям, просто добавьте следующие строки в Global.asax:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

А в фильтре действий вы можете просто проверить, имеет ли действие какие-либо другие атрибуты следующим образом:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}
 Chris Marasti-Georg14 авг. 2017 г., 20:15
Для любого, кто придет к этому из-за вопроса в заголовке вопроса, первая часть этого - фактический ответ на то, как запустить фильтр действия для каждого действия контроллера.
 hallizh09 авг. 2016 г., 15:58
ActionDescriptor в настоящее время не определяет "Определено".

кто читает это в 2013+, MVC4 теперь поддерживает использование [AllowAnonymous]

Вы можете поставить Авторизацию на контроллере, а затем Разрешить анонимно для любых функций, которые вы не хотите авторизовать.

Пример:

[Authorize] открытый класс HomeController: Controller {}

[AllowAnonymous]
public ActionResult Index()
{

} 

Будет ли это работать с пользовательским фильтром [MyAuthorize] или он работает только с [Authorize]

 Gh6107 авг. 2014 г., 15:23
Если вы извлекаете [MyAuthorize] из AuthorizeAttribute, [AllowAnonymous] будет работать для вас.

Может быть, попробовать и добавитьExcept свойство вашего первого атрибута?

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}
 Alex27 авг. 2009 г., 23:05
Как будет работать логика в фильтре действий? (На самом деле делает "Освобожденный» Работа)?

чтобы он применялся ко всем методам в этом классе

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Я нене знаю, как исключить конкретный метод из атрибута уровня класса. Может быть, использовать отдельный контроллер для неаутентифицированных запросов?

 Alex27 авг. 2009 г., 23:05
Создание отдельных контроллеров спагеттизовало бы мой код ... исключая конкретные методы из атрибута уровня класса, было бы именно то, что мне нужно.

Ваш ответ на вопрос