2013-04-09 13 views
5

Ho un'applicazione web, e alcuni utenti che utilizzano Chrome è uno dei browser di scelta, il seguente errore quando hanno disconnesso della domanda, e cercare di eseguire nuovamente l'accesso.Come risolvere Redirect Loop

"Questa pagina web ha un ciclo di reindirizzamento".

La mia applicazione web utilizza l'autenticazione di form, e il FormAuthenticationModule reindirizza l'utente alla pagina di login della mia candidatura, quindi non posso usare questo approccio:

<customErrors mode="On" defaultRedirect="~/MyErrorPage.aspx" > 

    <error statusCode="401" redirect="~/NoAccess.aspx"/> 

</customErrors> 

Invece, ho aggiunto quanto segue alla Page_Load evento del mio LoginPage.

if (Request.IsAuthenticated && !string.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
{ 
    Response.Redirect("~/NoAccess.aspx"); 
} 

Tuttavia, dal momento che ho aggiunto questo approccio, gli utenti sembrano ottenere l'errore "Redirect Loop".

Dopo aver cancellato i cookie, tutto sembra bene, ma il problema si ripresenta.

C'è una soluzione permanente per questo posso aggiungere al mio codice, o c'è altro che posso fare per evitare che questo problema accada?

risposta

7

Prova ad aggiungere questo al file web.config:

<location path="NoAccess.aspx"> 
    <system.web> 
     <authorization> 
     <allow users="?"/> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

Questo si spegnerà tutte le autorizzazioni per questa pagina e dovrebbe causare l'arresto del ciclo.

È possibile anche aggiungere questo:

<location path="Login.aspx"> 
    <system.web> 
     <authorization> 
     <deny users="?"/> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

Ciò negare l'accesso alla pagina di login per tutti gli utenti che sono già autenticati. La combinazione di questi due dovrebbe consentire di aggiungere errori personalizzati per tutti i reindirizzamenti.

Si può anche considerare di creare una directory per l'accesso non autorizzato (ad esempio public/) e inserendo tutte le pagine di errore (che non richiedono l'autorizzazione). allora si può fare:

<location path="public"> 
    <system.web> 
     <authorization> 
     <allow users="?"/> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

Si può leggere di più su posizione here. E altro ancora sull'autorizzazione here.

2

Avuto un problema molto simile e risolto in IIS: nella funzione abilitare Anonymous Authentication e disabilitare tutto il resto. Questo ha senso, in quanto questa è l'applicazione che gestisce la logica di autenticazione e non IIS o ASP.NET. Ma ovviamente questa soluzione non supporta l'elegante accesso alle pagine pubbliche come suggerito da @Grzegorz.

1

Ho anche avuto un ciclo di reindirizzamento che ha provocato il messaggio di errore The request filtering module is configured to deny a request where the query string is too long. per un sito Web di Visual Studio 2013 in cui l'autenticazione era impostata su account utente individuali.

L'URL richiesto era una versione lunga di http://localhost:52266/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl...., quindi è stato ovviamente il reindirizzamento continuo alla pagina di accesso e l'aggiunta dell'URL di ritorno ogni volta.

Nessuna quantità di punti di interruzione nel tentativo di trovare il loop incriminato sembrava fare la differenza, poiché nessuno era stato attivato.

Alla fine ho did the following:

  • trovare la proprietà del progetto. A tale scopo, selezionare il progetto (non la soluzione) e vedere la finestra Proprietà (non fare clic con il tasto destro del mouse, quindi scegliere Proprietà, altrimenti non lo si troverà).
  • Impostare Anonymous Authentication a Enabled.
  • Impostare Windows Authentication a Disabled.

All'avvio del progetto dovrebbe apparire la pagina predefinita e i punti di interruzione aggiunti dovrebbero iniziare a funzionare.

+0

Ho anche recentemente iniziato a utilizzare MVC 5, manterrò la soluzione in mente se mai dovessi incontrare questo problema. –