W zwykłej AccountController
w mojej aplikacji MVC3, jeśli ustawiono returnUrl
(w moim przypadku ustawię ją ręcznie), zadzwoni ona pod numer Redirect(returnUrl)
.Przekierowanie (relativeUrl) przekierowanie do niewłaściwej ścieżki w IIS
Załóżmy, że mój URL powrotu to /Admin/HealthCheck
(w rzeczywistości tak jest). Podczas debugowania otrzymuję adres URL podobny do http://localhost:3279/Admin/HealthCheck
z przekierowania.
Następnie wdrożyłem moją aplikację pod numer http://localhost/Test
. W takim przypadku Redirect(returnUrl)
przekierowuje mnie do http://localhost/Admin/HealthCheck
i , a nie oczekiwanego http://localhost/Test/Admin/HealthCheck
.
Co tu się dzieje? Jak mogę to naprawić (jeśli można to naprawić)?
Poniżej znajduje się fragment ze standardowego kontrolera Konto MVC3; możesz zobaczyć, skąd otrzymuję zwrotny adres URL z ciągu zapytania (np. http://localhost/Test/LogOn?ReturnUrl=/Admin/HealthCheck
, aczkolwiek URL jest zakodowany).
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
returnUrl = Request.Params["ReturnUrl"];
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
Po zalogowaniu, mój przypadek przekierowuje na stronę chronioną. Użytkownik próbuje uzyskać dostęp do chronionej strony, uzyskuje stronę logowania i powinien zostać przekierowany z powrotem. Jak mogę to zrobić? Wygląda na to, że twoim podejściem byłoby przechowywanie nazwy kontrolera, nazwy akcji i innych parametrów i użycie tego w 'Url.Action'. To nie wydaje się właściwe. – ashes999
@ ashes999, jeśli użytkownik próbuje uzyskać dostęp do chronionej strony, wpisuje ten adres strony na pasku adresu, prawda? A kiedy twoja aplikacja jest wdrożona w IIS, wpisuje '/ Test/Admin/HealthCheck' zamiast'/Admin/HealthCheck', czyż nie? Bo gdyby napisał "/ Admin/HealthCheck", dostałby 404 z IIS, prawda? W tym przypadku wszystko działa zgodnie z oczekiwaniami. Nie rozumiem, jaki jest twój problem. –