2017-06-14 9 views
0

Returnurl ist in Ordnung, wenn Login-Methode direkt aufgerufen wird. Wenn es von einer anderen Methode aufgerufen wird, die eine Authentifizierung erfordert, wird der Rückkehrpfad zur aktuellen URL HINZUGEFÜGT.ASPNET MVC ReturnUrl unerwartetes Verhalten, wenn eine Zwischenmethode Authentifizierung erfordert

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

Login.cshtml:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
         {(... omitted for brevity) 

Anmeldung Ansicht ist eine modal. So enthält es folgende Skript Benutzer die Handhabung des modalen ohne sich einzuloggen, endet:

$("#modalLoginDiv").on("hidden.bs.modal", function() { 
    window.location = '@ViewBag.ReturnUrl'; 
}); 

Aufruf der Methode direkt (home navbar) ab Seite

http://localhost:51003/Gifts/Details/1589

der ReturnUrl Wert „/ Geschenke/Details/1589 ", und Schließen der Login-Modal-Returns Seite , wie erwartet

Jetzt, wenn ein Anruf Verfahren, die eine Authentifizierung von folgendem Link auf derselben Seite anfordern http://localhost:51003/Gifts/Details/1589:

http://localhost:51003/messagemanager/ReportThis?productId=1589

[HttpGet] 
    [Authorize(Roles = "Admin, Users")] 
    public ActionResult ReportThis(int productId) 
    { 
     ViewBag.productId = productId; 
     return View(); 
    } 

als Report Methode Authentifizierung erfordert, wird Login-Methode gebrannt und wieder sieht ReturnUrl Wert in Login-Methode nur als erwartet:

/Messagemanager/Report productId = 1589

Wenn ich die Login-modal zu schließen, ohne in etwas Protokollierung Unvorhergesehenes passiert: während ReturnUrl Wert auf Login-Methode Parameter übergeben hält suchen fein, Browser-URL ist jetzt

http://localhost:51003/Account/Login?ReturnUrl=%2Fmessagemanager%2FReportThis%3FproductId%3D1589

, dass das ist returnUrl wurde der Konto-/Anmelde-URL hinzugefügt. Als Sicherheitsergebnis login modal lädt offensichtlich endlos weiter.

Ich kann nicht herausfinden, was dieses unerwartete Verhalten verursacht und wie es zu beheben, da ReturnUrl Wert immer gut aussieht, aber im ersten Fall ersetzt es korrekt vorherige URL während es durch eine Zwischenmethode aufgerufen wird, die dem Konto/Login hinzugefügt wird URL

+0

Haben Sie das Problem – hasan

Antwort

0

Können Sie versuchen ReturnUrl = Request.QueryString["ReturnUrl"] zu verwenden, anstatt ViewBag.ReturnUrl

Html.BeginForm("Login", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] }) 


[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Login(LoginInputModel model, string ReturnUrl) { 
... 
} 
+0

Hallo, danke für die Anregungen lösen, aber leider nichts geändert. Das Schließen der Login-Modalität führt dazu, dass http: // localhost: 51003/Account/Login? ReturnUrl =% 2Fmessagemanager% 2FReportThis% 3FproductId% 3D1589 ausgelöst wird, wodurch das Modal erneut geladen wird. ReturnUrl Querystring war und wird korrekt bewertet, das Problem ist, dass die Querystring nicht ersetzt wird, sondern weiterhin zu modalen Login-URL hinzugefügt wird. – Luke