6

Sto sviluppando un'applicazione SPA utilizzando AngularJS che funziona con l'API Web REST, sopra un livello molto piccolo di ASP.NET MVC4. Per ragioni non importanti qui, non sto utilizzando l'Account Controller predefinito di MVC4.Reindirizzamento all'URL originale con tag hash (#) interrotto in MVC4

In pratica, voglio condividere "compiti" tra gli utenti. Il mio obiettivo è di poter inviare l'URL di una specifica entità "attività" a qualsiasi utente, via email. Cliccando su quell'URL dovrebbe lanciare l'autenticazione. Dopo una corretta autenticazione, voglio visualizzare le informazioni della pagina delle attività reali.

AngularJS provoca miei URL di avere # segno, o un URL di una pagina che visualizza il compito "XYZ123" è: http://hostname.com/#/tasks/XYZ123

ASP.NET reindirizza l'accesso non autorizzato a quella URL: http://hostname.com/Home/Login?ReturnUrl=%2f#/tasks/XYZ123

Questo è OK, ma il metodo di controllo rilevante "taglia fuori" il percorso da #, quindi in:

public ActionResult Login(string returnUrl) 

il valore di 'ReturnURL' sarà solo "/"

Quindi, sto perdendo il percorso: Vorrei costruire un collegamento "Connect with Facebook" avere l'URL originale, come:

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

ma non ci riesco.

Qual è il modo corretto per risolvere questo problema?

Posso pensare di creare il mio URL di servizio di reindirizzamento senza # tag, ma questa soluzione implica un lavoro aggiuntivo e copre solo un caso quando il sistema invia un messaggio con l'URL dell'attività: gli utenti tenteranno comunque di copiare/incollare il URL di posizione dal browser.

Grazie per qualsiasi suggerimento.

Max

+2

Penso che il problema sia "#" non codificato in "% 23". Il browser sta semplicemente inviando la parte '% 2f' (che è una'/') prima di' # '. – Marthijn

+0

Marthijin ha ragione. Per risolvere il tuo problema, usa [encodeURIComponent] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) sul valore di 'ReturnUrl' quando costruisci l'URL – LostInComputer

risposta

0

È possibile utilizzare le proprietà di Request (come .Url o .QueryString) per ottenere l'url originale (e parametri URL), invece di basarsi sulla rilegatura automatica del parametro ReturnURL.

2

Sì. Un browser taglia "#/tasks/XYZ123" e richiede la pagina senza quell'hash. Anche se l'hash compare nella pagina di accesso, è di nuovo il lavoro del browser. Hash non sta viaggiando sul server.

Quindi quando un browser carica la pagina di accesso con? ReturnUrl =% 2f #/tasks/XYZ123 possiamo riscrivere l'azione Form e codificare l'hash.

Se il modulo si presenta come:

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

il codice JavaScript dovrebbe essere simile:

<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> 

La parte con window.history.pushState è necessario per il seguente:

Se non c'è hash, poi per uno SPA suo URL (più probabile) sarà:

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

ecco cerchiamo di sostituire URL (senza ricaricare la pagina) con più precisione

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

Questo è molto intelligente! È un peccato che tu non abbia guadagnato voti per questo. –