15

Creazione di un'applicazione MVC3 e TPTB ci vogliono utilizzare il loro fornitore di autorizzazioni personalizzato. Tuttavia, durante lo sviluppo questo provider di autenticazione è una specie di problema, dal momento che fornirà un errore fino a quando si spegne/riavvierà il browser, o richiederà la re-registrazione su ogni compilazione.Bypassare o disattivare [Authorize (Roles = "")] durante lo sviluppo?

Per ora, ho appena aggiunto <authentication mode="None"/> al web.config, che funziona bene finché non incontro un'azione o un controller che utilizza il filtro [Authorize(Roles = "Admin")] (può essere qualsiasi ruolo, non solo amministratore). Quando colpisce uno di questi, visualizza semplicemente una pagina vuota.

C'è un modo per spegnere globalmente e temporaneamente questi filtri? O semplicemente dare all'utente tutti i ruoli mentre sono in sviluppo?

EDIT

Lasciatemi clarify- realtà sto porting su una vasta applicazione dal MVC2 a MVC3. Ha un sacco di [Authorize(Roles="Admin")] e [Authorize(Roles="Admin,Editor")] in tutto questo. Preferirei non cambiarli tutti se possibile.

Devo creare un piccolo fornitore di ruoli personalizzato che fornisca automaticamente tutti i ruoli?

+1

risposta di Anri è migliore, perché non permette di utilizzare proxy HTTP exploit di ottenere il diritto di amministrazione sul server. – AgentFire

risposta

22

si potrebbe scrivere un costume Autorizzazione di filtro che non effettuerà alcun controllo se la richiesta proviene da localhost:

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

Grazie, questo è quello che ho finito per fare. Mi sono reso conto rapidamente che una ricerca/sostituzione dell'attributo Authorize era molto più semplice di qualsiasi altra cosa stavo considerando! –

+2

che dire piuttosto di controllare Request.IsLocal? Penso che sia più "a prova di proiettile". – mare

+0

Dovresti aggiungere un #if DEBUG al blocco intero se restituito, altrimenti potresti aprire un potenziale problema di perdita di dati in produzione. Cosa serve per fermare un malvagio amministratore che va in IE in produzione e digita http://127.0.0.1/refundCC?CC=1234689&amount=infinity – stevieg

12

è possibile ereditare da AuthorizeAttribute e realizzazioni separate con #if DEBUG direttiva.

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

O #define YOUR_OWN_FLAG per attivare il comportamento dentro e fuori in ogni costruzione, il debug o rilascio.

5

Per API Web:

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

I test per il loopback sono fantastici haha ​​perché non ci ho pensato –

Problemi correlati