2009-08-27 16 views
10

Zrobiłem nowy filtr akcji (atrybut podobny do [Autoryzuj]), który autoryzuje dostęp do akcji kontrolera w oparciu o wartość sesji. Jednak zasadniczo dekoruję wszystkie działania kontrolera tym atrybutem (z wyjątkiem bardzo niewielu).Wymuś działanie filtru dla wszystkich akcji kontrolera (C#/ASP.NET MVC)

Tak, myślałem, że byłoby lepiej mieć taką akcję filtru zawsze wykonany wyjątkiem w przypadkach, gdzie dołączyć [ExemptFromAuthorize] atrybut do działania kontrolera? (Może przez dziedziczenie do mojej własnej klasy kontrolera?)

Jak mogę to zrobić?

+0

To pytanie jest stare, aw MVC4 jest nowy atrybut o nazwie "AllowAnonymous" 'wykonane specjalnie do tego. – Omar

Odpowiedz

6

Działając z odpowiedzią jeef3, wymyśliłem to. Może użyć więcej sprawdzania błędów i niezawodności, jak wiele rozdzielonych akcji, ale ogólny pomysł działa.

W konkretnym przypadku można przetestować wartość sesji i zrezygnować również z autoryzacji.

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

} 

Zastosowanie:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")] 
public class AdminController : Controller 
... 
2

Możesz dodać atrybut do klasy, aby go zastosować do wszystkich metod w tej klasie

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

nie wiem jak wykluczyć konkretną metodę z atrybutem klasy poziomu. Może użyć osobnego kontrolera do nieuwierzytelnionych żądań?

+0

Tworzenie oddzielnych kontrolerów spowodowałoby spaghetti-ize mój kod ... wyłączając konkretne metody z atrybutu klasy poziom byłoby dokładnie tym, czego potrzebuję. – Alex

3

Może warto spróbować dodać właściwość Except do pierwszego atrybutu?

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

    public ActionResult View() 
    { 
     // Accessible by all 
    } 
} 
+0

Jak działałaby logika w filtrze działania? (Właściwie robiąc pracę "Exempt")? – Alex

7

wyjazdu mojego artykułu na codeproject -

http://www.codeproject.com/KB/web-security/AuthorizeWithExemptions.aspx

W tym artykule będę zapewnić Państwu rozwiązanie do zabezpieczania ASP.NET MVC kontrolerów aplikacji w taki sposób, aby wszystkie działania były zabezpieczone, z wyjątkiem tych, które zdefiniowano jako niezabezpieczone.

snipper z kodem:

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

To jest właśnie to, co zamierzałem zasugerować. –

0

Dla każdego, kto czyta ten w 2013+, MVC4 teraz wspiera stosowanie [AllowAnonymous]

można umieścić dopuszczać na kontrolerze, a następnie pozostawić anonimowy jakichkolwiek funkcji nie chcesz autoryzować.

Przykład:

[Authorize] 
public class HomeController : Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Index() 
    { 

    } 
} 
6

Rozumiem, że pytanie jest dość przestarzały, ale tak .. Jeśli chcesz zastosować filtr do wszystkich działań, po prostu dodaj poniższe linie do Global.asax:

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

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

I w filtrze działania można po prostu sprawdzić, czy działanie ma jakieś inne atrybuty w następujący sposób:

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false)) 
    { 
     // do what you want to do 
    } 
} 
+0

ActionDescriptor obecnie nie definiuje "IsDefined". – hallizh

+0

Dla każdego, kto przychodzi do tego pytania w tytule pytania, pierwsza część tego jest odpowiedzią na pytanie, jak uruchomić filtr akcji dla każdej akcji kontrolera. –

1

Dla każdego, kto czyta ten w 2013+, MVC4 teraz popiera wykorzystanie [AllowAnonymous]

Możesz umieścić Autoryzuj na kontrolerze, a następnie Pozwól anonimowo na dowolne funkcje, których nie chcesz autoryzować.

przykład:

[autoryzacji] Klasa publiczna HomeController: Kontroler {

[AllowAnonymous] 
public ActionResult Index() 
{ 

} 

}

to będzie działać z niestandardowym [MyAuthorize] Filtr lub działa tylko [Authorize]

+0

Jeśli czerpiesz swoją [MyAuthorize] z AuthorizeAttribute, [AllowAnonymous] będzie działać. – Gh61