15

Erstellen einer MVC3-Anwendung und TPTB möchten, dass wir ihren benutzerdefinierten Autorisierungsanbieter verwenden. Während der Entwicklung ist dieser Auth-Provider jedoch ein bisschen schmerzhaft, da er entweder einen Fehler gibt, bis Sie den Browser herunterfahren/neu starten, oder Sie müssen sich bei jeder Kompilierung neu anmelden.Umgehen oder deaktivieren [Autorisieren (Rollen = "")] während der Entwicklung?

Für jetzt habe ich gerade hinzugefügt <authentication mode="None"/> der web.config, die funktioniert, bis ich eine Aktion oder einen Controller, der [Authorize(Roles = "Admin")] Filter (es kann jede Rolle, nicht nur Admin) verwendet werden. Wenn es eines von diesen trifft, wird nur eine leere Seite wiedergegeben.

Gibt es eine Möglichkeit, diese Filter global und vorübergehend auszuschalten? Oder geben Sie dem Benutzer alle Rollen, während ich in der Entwicklung bin?

EDIT

Lassen Sie mich clarify- ich Portierung tatsächlich eine große App von MVC2 zu MVC3 über. Es hat viele [Authorize(Roles="Admin")] und [Authorize(Roles="Admin,Editor")] überall. Ich würde lieber nicht alle ändern, wenn möglich.

Sollte ich nur einen kleinen benutzerdefinierten Rollenanbieter erstellen, der alle Rollen automatisch gibt?

+1

Anri Antwort ist besser, weil es nicht ausnutzen erlaubt HTTP-Proxy zu verwenden Admin direkt auf dem Server zu erhalten. – AgentFire

Antwort

22

Sie könnten eine benutzerdefinierte Autorisieren Filter schreiben, die alle Kontrollen nicht durchführen, wenn die Anforderung von localhost kommt:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext.Request.Url.IsLoopback) 
     { 
      // It was a local request => authorize the guy 
      return true; 
     } 

     return base.AuthorizeCore(httpContext); 
    } 
} 
+0

Danke, das ist, was ich getan habe. Ich erkannte schnell, dass eine Suche/Ersetzung des Autorize-Attributs viel einfacher war als alles, was ich in Erwägung zog! –

+2

Wie wäre es mit Request.IsLocal? Ich denke, es ist "kugelsicherer". – mare

+0

Sie sollten einen #if DEBUG um den gesamten if-Block für die Rückgabe hinzufügen, da Sie sonst ein Problem mit dem Datenverlust in der Produktion bekommen. Was ist zu stoppen ein ruchloser Admin zu IE in Produktion gehen und http://127.0.0.1/refundCC?CC=1234689&amount=infinity – stevieg

12

Sie aus AuthorizeAttribute und separaten Realisierungen mit #if DEBUG Richtlinie erben können.

public class MyAuthorizeAttribute: AuthorizeAttribute 
{ 
#if DEBUG 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return true; 
    } 
#endif 
} 

Oder #define YOUR_OWN_FLAG drehen Verhalten ein- und ausschalten in jedem Build, Debug oder Release.

5

für Web-API:

public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     return actionContext.Request.RequestUri.IsLoopback || base.IsAuthorized(actionContext); 
    } 
} 
+0

Test für die Loopback ist super haha ​​warum habe ich nicht daran denken –