2013-04-09 20 views
5

Mam aplikację internetową, a niektórzy użytkownicy, którzy używają Chrome jako preferowanej przeglądarki, otrzymają następujący błąd po wylogowaniu się z aplikacji i spróbują się zalogować ponownie.Jak rozwiązać problem z pętlą przekierowania

"Ta strona ma pętlę przekierowania".

Moja aplikacja internetowa korzysta z uwierzytelniania formularzy, a FormAuthenticationModule przekierowuje użytkownika z powrotem do strony logowania mojej aplikacji, więc nie mogę użyć tego podejścia:

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

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

</customErrors> 

Zamiast Dodałem następujące do Page_Load wydarzenie z mojego LoginPage.

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

Jednak od czasu dodania tego podejścia użytkownicy wydają się otrzymywać komunikat "Redirect Loop".

Po wyczyszczeniu plików cookie wszystko wygląda dobrze, ale problem występuje ponownie.

Czy istnieje na to trwała poprawka, którą mogę dodać do mojego kodu lub czy mogę zrobić coś innego, aby zapobiec temu problemowi?

Odpowiedz

7

warto dodać to do pliku web.config:

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

To wyłączy żadnych zezwoleń na tej stronie i powinien zatrzymać pętlę.

Można również dodać to:

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

Spowoduje to zablokowanie dostępu do strony logowania się do wszystkich użytkowników, którzy są już uwierzytelnionych. Połączenie tych dwóch elementów powinno umożliwić dodanie niestandardowych błędów dla wszystkich przekierowań.

Można również rozważyć utworzenie katalogu dla nieautoryzowanego dostępu (np. public/) i umieszczenie we wszystkich stronach błędów (które nie wymagają autoryzacji). Następnie można zrobić:

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

można przeczytać więcej na temat lokalizacji here. Więcej informacji o autoryzacji here.

2

Miał bardzo podobny problem i rozwiązał go w IIS: W opcji Authentication włącz Anonymous Authentication i wyłącz wszystkie pozostałe. Ma to sens, ponieważ ostatecznie jest to aplikacja, która zarządza logiką uwierzytelniania, a nie IIS lub ASP.NET. Ale oczywiście to rozwiązanie nie obsługuje eleganckiego dostępu do stron publicznych, jak zasugerował @Grzegorz.

1

Posiadałem również pętlę przekierowań, która spowodowała wyświetlenie komunikatu o błędzie The request filtering module is configured to deny a request where the query string is too long. dla witryny sieci Web Visual Studio 2013, w której uwierzytelnianie zostało ustawione na indywidualne konta użytkowników.

Żądany adres URL był długą wersją http://localhost:52266/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl...., więc najwyraźniej nieustannie przekierowywał się do strony logowania i dołączał za każdym razem adres URL powrotu.

Żadna ilość punktów przerwania w próbie znalezienia niepokojącej pętli nie spowodowała zmiany, ponieważ żadna nie została wywołana.

W końcu did the following:

  • Znajdź właściwości projektu. Zrób to, wybierając projekt (nie rozwiązanie) i zobacz okno Właściwości (nie klikając prawym przyciskiem myszy, wybierz Właściwości, w przeciwnym razie go nie znajdziesz).
  • Ustaw Anonymous Authentication na Enabled.
  • Ustaw Windows Authentication na Disabled.

Rozpoczynając projekt domyślna strona powinna się pojawić i wartości graniczne zostały dodane powinien rozpocząć pracę.

+0

Niedawno zacząłem również używać MVC 5, będę pamiętać o rozwiązaniu, jeśli kiedykolwiek napotkam ten problem. –

Powiązane problemy