Na naszej stronie MVC zabezpieczamy nasze punkty końcowe za pomocą atrybutu Authorize
, jednak chciałbym przekierować użytkownika do ekranu logowania, kiedy to nastąpi. Moje pierwsze rozwiązanie było przekierować na Application_EndRequest
w Global.asax.cs
:Jak mogę przekierować na mój ekran logowania po nieautoryzowanym otrzymaniu kodu statusu 401 w MVC?
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Response.StatusCode == (int) HttpStatusCode.Unauthorized)
{
Response.ClearContent();
Response.Redirect("/Account/Login");
}
}
Problemem jest to, że niektóre z naszych poglądów są ładowane przez AJAX, w tym przypadku nie chcemy, aby wyświetlić ekran logowania w dynamicznie załadowanego div (dzieje się tak na przykład po naciśnięciu przycisku Wstecz po wylogowaniu). Byłoby lepiej, gdyby żądanie nadal zwracało ekran logowania, ale z 401 nieautoryzowanym kodem statusu, abyśmy mogli wykryć to zdarzenie. Oczywiście to nie zadziała z tym podejściem, ponieważ przekierowanie opiera się na kodzie statusu 302.
Zamiast tego wolałbym "wstawić" zawartość ekranu logowania w numerze Application_EndRequest
z kodem stanu 401. Tak więc, zamiast Response.Redirect
, próbowałem to:
...
Response.ClearContent();
Server.TransferRequest("~/Account/Login");
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
...
Przekierowanie działa ładnie, ale ponieważ wykonuje nową prośbę, nie mogę ustawić kod stanu w ten sposób, a ja dostaję 200. Nadal nie nadaje się do wykrycia nieautoryzowanego żądania.
Próbowałem również:
...
Response.ClearContent();
Server.Transfer("~/Account/Login");
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
...
Ale otrzymuję wyjątek "Błąd podczas wykonywania żądania dla dzieci/Konta/login".
Próbowałem również:
...
Response.ClearContent();
HttpContext.Current.RewritePath("~/Account/Login");
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
Response.End();
...
Ale to zgłasza wyjątek "Temat był przerwany". Nie jestem pewien, czy Response.End() jest konieczne, ale bez niego, po prostu uzyskać standardowy błąd IIS 401.
Jak mogę zwrócić zawartość mojego ekranu logowania, ale z kodem statusu 401?
Spróbuj użyć niestandardowej obsługi błędów za pomocą zestawu 401, aby zwrócić widok logowania. –