2009-08-27 6 views
10

Ich habe einen neuen Aktionsfilter (Attribut, ähnlich wie [Autorisieren]) erstellt, der den Zugriff auf eine Controlleraktion basierend auf einem Sitzungswert autorisiert. Allerdings dekoriere ich im Grunde alle meine Controller-Aktionen mit diesem Attribut (mit Ausnahme von sehr wenigen).Aktionsfilter bei allen Controller-Aktionen erzwingen (C#/ASP.NET MVC)

So, dachte ich, es wäre besser, dass die Aktion Filter haben immer außer in Fällen ausgeführt, in dem ich eine [ExemptFromAuthorize] Attribut auf eine Controller-Aktion anhängen? (Vielleicht durch Erben zu meiner eigenen Controller-Klasse?)

Wie kann ich das tun?

+0

Diese Frage ist alt und in MVC4 gibt es ein neues Attribut namens AllowAnonymous 'speziell dafür gemacht. – Omar

Antwort

6

Laufen mit jeef3 's Antwort, ich kam mit diesem. Es könnte mehr Fehlerprüfung und Robustheit wie mehrere begrenzte Aktionen verwenden, aber die allgemeine Idee funktioniert.

In Ihrem speziellen Fall könnten Sie den Sitzungswert testen und entscheiden, auch aus der Autorisierung zurückzukommen.

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

} 

Verbrauch:

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

Sie können das Attribut der Klasse hinzufügen, um es auf alle Methoden in dieser Klasse gelten haben

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

Ich weiß nicht, wie eine bestimmte Methode aus einer Klasse-Level-Attribut. Vielleicht einen separaten Controller für nicht authentifizierte Anfragen verwenden?

+0

Die Erstellung separater Controller würde meinen Code spaghetti-shape ... das Ausschließen bestimmter Methoden aus dem Attribut class level wäre genau das, was ich brauche. – Alex

3

Vielleicht versuchen Sie, eine Except Eigenschaft zu Ihrem ersten Attribut hinzuzufügen?

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

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

Wie funktioniert die Logik im Aktionsfilter? (Tatsächlich macht die "befreite" Arbeit)? – Alex

7

Siehe meinen Artikel über Codeproject -

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

In diesem Artikel werde ich Ihnen eine Lösung bieten für ASP.NET MVC Sicherung die Controller der Anwendung so, dass alle Aktionen abgesichert sind, mit Ausnahme derer, die Sie als unsicher definieren.

snipper aus dem Code:

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

Das ist ziemlich genau das, was ich vorschlagen würde. –

0

Für alle diese in 2013+ Lesen, unterstützt MVC4 nun die Verwendung von [AllowAnonymous]

Sie können autorisieren, auf dem Controller setzen und dann Allow Anonymous auf alle Funktionen Sie möchten nicht autorisieren.

Beispiel:

[Authorize] 
public class HomeController : Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Index() 
    { 

    } 
} 
6

Ich verstehe die Frage ziemlich veraltet ist, aber trotzdem .. Wenn Sie Filter auf alle Aktionen anwenden möchten nur folgende Zeilen in globalen hinzufügen.asax:

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

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

Und in Aktion Filter können Sie einfach überprüfen, ob Aktion alle anderen Attribute in folgender Weise hat:

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

ActionDescriptor definiert derzeit nicht "IsDefined". – hallizh

+0

Für jeden, der die Frage im Titel der Frage beantwortet, ist der erste Teil die Antwort darauf, wie ein Aktionsfilter bei jeder Controller-Aktion ausgeführt wird. –

1

Für alle diese in 2013+ Lesen, unterstützt MVC4 nun die Verwendung von [AllowAnonymous]

Sie können Authorize auf den Controller setzen und dann Anonymous auf alle Funktionen zulassen, die Sie nicht autorisieren möchten.

Beispiel:

[autorisieren] public class Homecontroller: Controller {

[AllowAnonymous] 
public ActionResult Index() 
{ 

} 

}

Würde diese Arbeit mit einem benutzerdefinierten [MyAuthorize] Filter oder ist es nur mit Arbeit [Authorize]

+0

Wenn Sie Ihre [MyAuthorize] von AuthorizeAttribute ableiten, funktioniert [AllowAnonymous] für Sie. – Gh61