Wie funktioniert die Umleitung zu returnUrl Arbeit in Asp.Net MVC5
Habe ich begonnen, eine neue MVC 5 Website, mit den neuen Asp.Net Identität mit Owin. In meinem "Konto" - controller, die mit dem Attribut [Autorisieren], ich habe ziemlich standard-Aktionen;
//GET: /User/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
//POST: /User/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
try
{
if (ModelState.IsValid)
{
var userApi = new UserService();
var apiUser = await userApi.LogIn(UserManager, model.CardNumber, model.Pin, model.RememberMe);
if (apiUser != null)
{
await SignInAsync(apiUser, model.RememberMe);
if (string.IsNullOrEmpty(returnUrl))
{
return RedirectToAction("UserLoggedIn", "User");
}
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
}
catch (Exception ex)
{
Trace.TraceError("Cannot login {0}", ex.ToString());
Response.AppendToLog(ex.ToString());
ModelState.AddModelError("", ex.ToString());
}
//If we got this far, something failed, redisplay form
return View(model);
}
Meine Frage ist in Bezug auf die returnUrl Verhalten, der obige code funktioniert in dem Sinne, dass, wenn ein Benutzer nicht angemeldet und ruft eine action in einem controller, der mit dem Attribut [Autorisieren], es wird gesendet, um die login-Aktionen oben und dann wieder in den controller/action wurde angefordert. Die ist toll, ABER wie?? Und ist es sicher?
In diesem Artikel über "Verhinderung von open-redirect-Angriffe"(für frühere Versionen von Asp.Net MVC) die Empfehlung zu einer überprüfung auf der returnUrl, dass es eine lokale url, bevor Sie die Weiterleitung, ist, dass etwas sollte ich noch tun oder ist es jetzt gehandhabt durch das framework?
Cheers,
Ola
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie prüfen, ob die url lokal ist in der Tat mit dieser Methode (es ist nicht bearbeitet, die das framework automatisch): http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.islocalurl%28v=vs.118%29.aspx
returnUrl
argument nie verwendet.return RedirectToLocal(returnUrl);
ich nehme an, diese Funktion führt die lokale url-Validierung code in meiner Antwort.Als Sandeep Phadke gesagt, die returnUrl-Parameter gefüllt wird, weil der Konfiguration im startup.Auth.cs.
Den CookieAuthenticationOptions hat eine Eigenschaft ReturnUrlParameter, die per Default auf "returnUrl". Das ist der Grund, warum es sieht aus wie Magie. Sie können es zu Ändern, was Sie wollen:
Dann können Sie Ändern Sie den AccountController Login-Aktion:
Zur Beantwortung Ihrer ersten Frage, wie Sie die redirect-Url-Installation konfiguriert
Startup.Auth.cs
die aufgerufen wird, ausStartup.cs
und markiert ist, mit einem Attribut, welches wahrscheinlich nach Begriffen, die von der OWIN-framework auf app starten und die beiden Dateienpartial
erweiternStartup
Klasse.In
Startup.Auth.cs
es gibt eine Klasse zum konfigurieren der Authentifizierung Optionen und in der Regel hat der folgende codeHabe ich den
CookieSecure
option, um sicherzustellen cookies wurden unterzeichnet und wird empfohlen als eine gute Sicherheit der Praxis, außer, dass Ihr boiler-plate-code.Mehr Dokumentation auf CookieAuthenticationOptions, wenn Sie es wollen.
CookieSecureOption.Always
. Abgesehen von der Dokumentation, diese Kräfte, die Sie für die Verwendung von HTTPS für die lokale Entwicklung zu. Standardmäßig ist esCookieSecureOption.SameAsRequest
. Also, wenn Ihre website in HTTPS, es wird empfohlen, keine änderung derCookieSecure
Eigenschaft, da die Standard-Einstellung ist sicher genug.