Wie funktioniert die Umleitung zu returnUrl in Asp.Net MVC5?

Ich habe eine neue MVC 5-Site mit der neuen Asp.Net Identity mit Owin gestartet. In meinem "Konto" -Controller, der das Attribut [Autorisieren] hat, habe ich ziemlich Standardaktionen;

  //GET: /User/Login
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        } 

// POST: /User/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task 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 bezieht sich auf das Verhalten von returnUrl. Der obige Code funktioniert in dem Sinne, dass wenn ein Benutzer nicht angemeldet ist und eine Aktion in einem Controller aufruft, der das Attribut [Authorize] hat, wird er an die obigen Login-Aktionen gesendet kehrte dann zu dem Controller/der Aktion zurück, die angefordert wurde. Was ist toll, ABER wie ?? Und ist es sicher?

In diesem Artikel über " Offenen Redirect-Angriffen verhindern " ( für frühere Versionen von Asp.Net MVC) empfiehlt es sich, vor der Umleitung zu überprüfen, ob es sich um eine lokale URL handelt, sollte ich das noch tun oder wird es jetzt vom Framework behandelt?

Prost, Ola

0

4 Antworten

You need to check if the url is local indeed using this method (it is not handled by the framework automatically): http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.islocalurl%28v=vs.118%29.aspx

if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
  return Redirect(returnUrl);
}
0
hinzugefügt
Haben Sie eine Quelle für die Information, dass sie nicht behandelt wird? Es scheint seltsam, dass sie die Funktionalität einfügen würden, um automatisch zu returnUrl umzuleiten, aber nicht ihren eigenen Richtlinien zu folgen. Daher die ursprüngliche Frage.
hinzugefügt der Autor Ola Karlsson, Quelle
Ja, ich denke, das wäre eine Option. Ich weiß, dass die returnUrl nie in meiner Aktion verwendet wird, aber die Seite leitet immer noch richtig um, weshalb ich mich wundere, wie es funktioniert, Magie oder nur, dass etwas passiert oder dass sie automatische Unterstützung hinzugefügt haben Dieses Zeug?
hinzugefügt der Autor Ola Karlsson, Quelle
Ich fand das, was darüber spricht blogs.msdn.com/b/webdev/archive/2013/07/03/hellip; aber nicht wirklich viel weiser werde ich zugeben.
hinzugefügt der Autor Ola Karlsson, Quelle
Warum versuchst du nicht, das returnUrl zu manipulieren und zu sehen, was passiert? Übrigens, in Ihrem Code wird das Argument returnUrl niemals verwendet.
hinzugefügt der Autor Marthijn, Quelle
Das ist in der Tat ein merkwürdiges Verhalten. Ich kann nichts über die Behandlung von returnUrl in mvc 5 finden, also sollte es genauso funktionieren wie in den älteren Versionen.
hinzugefügt der Autor Marthijn, Quelle
Sehen Sie sich das letzte Code-Snippet in diesem Artikel an: return RedirectToLocal (returnUrl); Ich nehme an, diese Funktion führt den lokalen URL-Validierungscode in meiner Antwort aus.
hinzugefügt der Autor Marthijn, Quelle
       if (Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Controller");
        }
0
hinzugefügt
Ich kenne diesen Code, die Frage ist, ob ich ihn verwenden muss oder ob dies im Framework für MVC5 gehandhabt wird
hinzugefügt der Autor Ola Karlsson, Quelle

Um Ihre erste Frage zu beantworten, wie die Weiterleitungs-Url eingerichtet ist, wird sie in Startup.Auth.cs konfiguriert, die von Startup.cs aufgerufen wird und mit einem Attribut markiert ist wahrscheinlich nach dem OWIN-Framework beim App-Start gesucht und beide Dateien partially erweitern eine Startup -Klasse.

In Startup.Auth.cs gibt es eine Klasse zum Konfigurieren von Authentifizierungsoptionen und hat normalerweise den folgenden Code

public partial class Startup
{
   //For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
       //Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            CookieSecure = CookieSecureOption.Always
        });
       //Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

       //....
       //I deleted code which is commented out if you selected "Individual accounts" 
       //if you created the site project using the VS 2013 wizard
       //...
    }
}

Ich habe die Option CookieSecure hinzugefügt, um sicherzustellen, dass Cookies signiert wurden und dass dies als gute Sicherheitsvorkehrung empfohlen wird, außer dass es sich um den Code des Kessels handelt.

Weitere Dokumentation zu CookieAuthenticationOptions , wenn Sie es wünschen.

0
hinzugefügt
Wenn Ihre gesamte Website in HTTPS ist, ist es überflüssig, CookieSecureOption.Always zu verwenden. Aus der Dokumentation heraus erfordert dies, dass Sie HTTPS auch für die lokale Entwicklung verwenden. Standardmäßig ist CookieSecureOption.SameAsRequest . Wenn Ihre Website in HTTPS ist, wird empfohlen, die CookieSecure -Eigenschaft nicht zu ändern, da die Standardeinstellung sicher genug ist.
hinzugefügt der Autor QuantumHive, Quelle

Wie Sandeep Phadke sagte, ist der Parameter returnUrl wegen der Konfiguration in startup.Auth.cs gefüllt.

Die CookieAuthenticationOptions hat eine Eigenschaft ReturnUrlParameter, die standardmäßig auf "returnUrl" eingestellt ist. Das ist der Grund, warum es wie Magie aussieht. Sie können es ändern, was Sie wollen:

app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        ReturnUrlParameter = "returnTo"
    });

Dann können Sie die AccountController Login-Aktion folgendermaßen ändern:

[AllowAnonymous]
    public ActionResult Login(string returnTo)
    {
        ViewBag.ReturnUrl = returnTo;
        return View();
    } 
0
hinzugefügt