2009-07-15 26 views
2

Was ist der beste Weg, um bestimmte Bereiche Ihrer Web-Anwendung in asp .net mvc zu schützen. Ich weiß, wir können [Authorization] Attribut bei jeder Aktion setzen, aber das scheint sehr langweilig, da Sie es überall platzieren müssen. Ich verwende den Mitgliedschaftsprovider und versuche den Postback-Modus, indem ich diesen Schutz basierend auf dem Ordner einstelle. Ich verwende web.config <location> Abschnitt, um einige Ordner zu schützen. Ich habe versucht, dies in MVC, es scheint zu arbeiten, aber die meisten der Tutorial verwendet die [Authorization] Weg.Asp. NET-Mvc-Autorisierung

Welches ist die bessere Methode?

Antwort

4

Ich würde sehr empfehlen, es in die web.config zu setzen. Eigentlich auch Conery, Hanselman, Haack und Guthrie - obwohl nicht hoch (p223 von Professional ASP.NET MVC 1.0)

Routen können sich ändern, vor allem in MVC. Mit dem WebForm-Modell werden Routen physisch im Dateisystem dargestellt, sodass Sie sich nicht wirklich darum kümmern müssen. In MVC sind Routen "mangels eines besseren Begriffs" "dynamisch".

Sie könnten mehrere Routen zu einem Controller zuordnen, was zu Wartungsschwierigkeiten in der web.config führt. Schlimmer noch, könnte man versehentlich eine Route einen Controller aufrufen haben versehentlich oder vergessen, die web.config nach dem Hinzufügen/Ändern Routen zu aktualisieren und sich offen lassen.

Wenn Sie jedoch Ihren Controller anstelle der eigentlichen Route sichern, müssen Sie sich keine Sorgen darüber machen, die web.config synchron mit dem Treiben der Controller und dem Ändern der Routen zu halten.

Nur meine 2 Cent.

2

setzen [Authorization] an der Spitze der Controller-Klasse. das wird die gesamten Controller-Aktionen sperren.

+0

ok danke. Die Frage ist, welche ist besser, setzen Sie es in alle Ihre Controller oder richten Sie es in einer Datei web.config. Ich wähle die web.config. – dritterweg

+0

Yeah, irgendwie schwer, damit nicht einverstanden zu sein. :) – griegs

3

Eine mögliche Lösung ist es, eine „geschützte Controller“ zu erstellen und sie als Basisklasse für alle Bereiche Ihrer Anwendung verwenden, können Sie

[Authorize] 
public class ProtectedBaseController : Controller { 

} 

public class AdminController : ProtectedBaseController { 
    ... 
} 

public class Admin2Controller : ProtectedBaseController { 
    ... 
} 
+1

Wie kommt die richtige Antwort hat die wenigsten Stimmen? – ckonig

0

Sie setzen schützen wollen [autorisieren] zu jedem contoller Sie müssen sichern.

Sie können den Filter GlobalFilters.Add hinzufügen (new AuthorizeAttribute()); in Ihrem Startup.cs (oder Global.asax) und setzen [AllowAnonymus] -Attribut zu jedem Controller oder Aktion, die Sie nicht registrierten Benutzern erlauben.

Wenn Sie setzen wählte [autorisieren] zu jedem sicheren contoller Sie müssen sicher sein, dass jeder Controller durch Sie oder jemand anderen im Team hinzugefügt sicher. Für diese Anforderung verwende ich solchen Test:

[Fact] 
public void AllAuth() 
{ 
    var asm = Assembly.GetAssembly(typeof (HomeController)); 
    foreach (var type in asm.GetTypes()) 
    { 
     if (typeof(Controller).IsAssignableFrom(type)) 
     { 
      var attrs = type.GetCustomAttributes(typeof (AuthorizeAttribute)); 
      Assert.True(attrs.Any()); 
     } 
    } 
} 

ich glaube, diese Art und Weise ist besser als ein zu schaffen ProtectedContoller, weil es keine Gewähr dafür, dass Sie System hat alle Controller sicher. Auch dieser Weg verwendet keine Vererbung, die das Projekt schwerer macht.