2009-04-23 7 views
26

Ich habe einen Controller und ich möchte die Autorisierung für alle Aktionen standardmäßig mit Ausnahme eines Paares erfordern. Im folgenden Beispiel sollten alle Aktionen eine Authentifizierung mit Ausnahme des Indexes erfordern. Ich möchte nicht jede Aktion mit dem Autorisieren dekorieren, ich möchte die Standardautorisierung unter bestimmten Umständen wahrscheinlich mit einem benutzerdefinierten Filter wie NotAuthorize überschreiben.ASP MVC Autorisieren Sie alle Aktionen außer ein paar

[Authorize] 
public class HomeController : BaseController 
{ 
    [NotAuthorize] 
    public ActionResult Index() 
    { 
     // This one wont 
     return View(); 
    } 

    public ActionResult About() 
    { 
     // This action will require authorization 
     return View(); 
    } 
} 

Antwort

37

Ok, das ist was ich getan habe. Wenn es einen besseren Weg gibt, lass es mich wissen.

public class NotAuthorizeAttribute : FilterAttribute 
{ 
    // Does nothing, just used for decoration 
} 

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Check if this action has NotAuthorizeAttribute 
     object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(true); 
     if (attributes.Any(a => a is NotAuthorizeAttribute)) return; 

     // Must login 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 
+15

Ich denke MVC4 Sie kopiert und jetzt haben wir [AllowAnonymous] –

+0

noch nützlich zu wissen, wann benutzerdefinierte Validierung Funktionalität in kundenspezifischen Steuerungen zu schaffen :) – JDandChips

6

Hier ist, was ich tun würde, ähnlich wie Craig Antwort mit ein paar Änderungen:

1) Erstellen Sie ein gewöhnliches Attribut aus System.Attribute Ableitung (keine Notwendigkeit von FilterAttribute abzuleiten, da Sie nicht sind wird alles verwenden, was FilterAttribute bietet).

Vielleicht erstellen Sie eine Klassenhierarchie von Attributen, so dass Sie basierend auf der Hierarchie, z.

Attribute 
    AuthorizationAttribute 
     AuthorizationNotRequiredAttribute 
     AuthorizationAdminUserRequiredAttribute 
      AuthorizationSuperUserRequiredAttribute 

2) In Ihrem Baseüberschreiben die OnAuthorization Methode anstatt die OnActionExecuting Methode:

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    var authorizationAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<AuthorizationAttribute>(); 
    bool accountRequired = !authorizationAttributes.Any(aa => aa is AuthorizationNotRequiredAttribute); 

ich den Ansatz wie die standardmäßig sicher sein: auch wenn Sie ein Attribut auf der Aktion zu setzen vergessen es erfordert mindestens einen Benutzer, um angemeldet zu sein.

+1

wenn Ich überschreibe OnAuthorization (AuthorizationContext filterContext), filterContext hat keine ActionDescriptor-Eigenschaft, also habe ich keine Ahnung, wie die benutzerdefinierten Attribute von filterContext zu finden sind. – spaceman

+0

Können Sie bestätigen, dass dies ASP.NET MVC 2 ist? Da ist definitiv ein ActionDescriptor in V2. –

+0

Tut mir leid, Mann, du hast Recht, ich betreibe MVC 2 noch nicht. – spaceman

1

Wenig spät zur Partei, aber ich endete am Erstellen einer Controller-Ebene Auth-Attribut und eine Action-Ebene Auth-Attribut und nur über die Controller-Auth, wenn die Aktion hatte ihr eigenes Auth-Attribut. Siehe Code hier:

https://gist.github.com/948822

26

Was [AllowAnonymous] ??

+0

hatte Dies wurde später erstellt, ist aber jetzt die richtige Antwort. – Technetium

6

Verwenden Sie einen benutzerdefinierten Filter wie unter Securing your ASP.NET MVC 3 Application beschrieben.

+1

Beachten Sie, dass Link-Only-Antworten nicht empfohlen werden, Stack Overflow-Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (im Gegensatz zu einem weiteren Zwischenstopp von Referenzen, die im Laufe der Zeit veralten). –

5

Mark die Steuerung mit [autorisieren]

[Autorisieren] öffentliche Klasse YourController: ApiController

Mark Aktionen, die Sie öffentlich wollen mit:

[AllowAnonymous]

Verwandte Themen