6

Ich entwickle eine SPA-Anwendung mit AngularJS mit REST Web API, auf einer sehr kleinen Schicht von ASP.NET MVC4. Aus Gründen, die hier nicht wichtig sind, verwende ich nicht den Standard-Account-Controller von MVC4.Umleitung auf Original-URL mit Hash-Tag (#) in MVC4 zerbrochen

Grundsätzlich möchte ich "Aufgaben" zwischen Benutzern teilen. Mein Ziel ist es, die URL einer bestimmten "Task" -Entität per E-Mail an jeden Benutzer senden zu können. Ein Klick auf diese URL sollte die Authentifizierung starten. Nach einer erfolgreichen Authentifizierung möchte ich die Informationen der realen Aufgabenseite anzeigen.

AngularJS verursacht meine URLs # Zeichen, oder eine URL einer Seite Anzeigen der Aufgabe "XYZ123" ist zu haben: http://hostname.com/#/tasks/XYZ123

ASP.NET leitet den unberechtigten Zugriff auf diese URL zu: http://hostname.com/Home/Login?ReturnUrl=%2f#/tasks/XYZ123

das ist in Ordnung, aber die entsprechende Controller-Methode des Weg von # „schneidet“, so in:

public ActionResult Login(string returnUrl) 

der Wert von ‚returnUrl‘ nur sein „/“

Also, ich verliere den Weg: Ich möchte einen "Connect with Facebook" Link, um die Original-URL erstellen, die, wie:

http://hostname.com/Login/ExternalLogin?ReturnUrl=%2F#/tasks/XYZ123

aber ich kann es nicht.

Was ist der richtige Weg, um dieses Problem zu lösen?

Ich kann mir vorstellen, meine eigene Umleitungsdienst-URL ohne # Tag zu erstellen, aber diese Lösung bedeutet zusätzliche Arbeit und deckt nur einen Fall ab, wenn das System eine Nachricht mit Aufgaben-URL sendet - Menschen werden immer noch versuchen, die Nachricht zu kopieren/einzufügen Standort-URL aus dem Browser.

Danke für jeden Hinweis.

Max

+2

Ich denke, das Problem ist das '#' ist nicht codiert in '% 23'. Der Browser sendet gerade den '% 2f' (was ein'/') Teil vor dem' # 'ist. – Marthijn

+0

Marthijin hat Recht. Um Ihr Problem zu lösen, verwenden Sie [encodeURIComponent] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) für den Wert von 'ReturnUrl' beim Erstellen der URL – LostInComputer

Antwort

0

können Sie die Eigenschaften von Request verwenden (wie .Url oder .QueryString) die Original-URL zu erhalten (und URL-Parameter), statt von returnUrl Parameter auf die automatische Bindung zu verlassen.

2

Ja. Ein Browser schneidet '#/tasks/XYZ123' ab und fordert die Seite ohne diesen Hash an. Obwohl der Hash selbst auf der Anmeldeseite angezeigt wird, ist der Browser wieder funktionsfähig. Hash reist nicht zum Server.

Wenn also ein Browser die Anmeldeseite mit ReturnUrl =% 2f #/tasks/XYZ123 lädt, können wir die Formularaktion umschreiben und den Hash codieren.

Wenn das Formular wie folgt aussieht:

<script src="~/js/jquery.js"></script> 

<script type="text/javascript"> 
    $(function() { 

     var search = $(location).attr('search') || ''; 
     var hash = $(location).attr('hash') || ''; 

     if (hash.length === 0) {     
      if (window.history.pushState) { 
       window.history.pushState('login', 'Login', '/Home/Login'); 
      } 
     } else if (search === '?ReturnUrl=%2f') { 
      $('form').attr('action', '/Home/Login' + search + encodeURIComponent(hash)); 
     } 

    }); 

</script> 

Der Teil mit window.history:

<form action="/Home/Login" method="post" > 
    ... 
</form> 

Der Javascript-Code aussehen sollte.pushstate ist erforderlich für:

Wenn es keine Hash ist, dann für eine SPA seine URL (wahrscheinlicher) sein wird:

http://hostname.com/Home/Login?ReturnUrl=%2f 

so hier wir versuchen URL zu ersetzen (ohne Neuladen der Seite) mit genauer

http://hostname.com/Home/Login 
+0

Dies ist sehr schlau! Es ist eine Schande, dass Sie dafür keine Stimmen bekommen haben. –