2011-12-26 11 views
12

Sto utilizzando Url.IsLocalUrl per verificare se l'URL di ritorno passato alla mia azione di autenticazione è locale o meno. Funziona bene finché non ci sono frammenti nell'URL. Cioè, /t/test-team-3/tasks/lists/15 restituisce true, ma /t/test-team-3/tasks#/lists/15 restituisce false.Perché Url.IsLocalUrl restituisce false se l'URL contiene un frammento?

Qual è il motivo dietro questo? C'è qualche oscuro problema di sicurezza che potrebbe manifestarsi nel frammento o posso ignorare il frammento in modo sicuro quando sto verificando se l'URL è locale?

risposta

20

Questo metodo chiama internamente il metodo Uri.IsWellFormedUriString. Quando chiami questo metodo su un URL relativo contenente un frammento restituisce false. C'è a bug on MS Connect che viene chiuso con il motivo dal motivo.

Quando si utilizza questo metodo su un URL assoluto (con uno schema come http/https), il metodo si comporta come previsto. Penso che la ragione sia che la classe Uri è destinata a funzionare non solo con URL HTTP. Quando non si specifica il protocollo (URL relativo), viene utilizzato un parser URL generico che non consente i frammenti.

Quindi credo che si hanno due possibilità:

  • Striscia il frammento prima di chiamare il metodo
  • Chiamare il metodo su un URL assoluto (http://foo.com/t/test-team-3/tasks#/lists/15), perché in ogni caso se si chiama questo metodo su un URL relativo possiamo aspettarci che sia un URL locale.
+3

Ci sono altri effetti collaterali quando si chiama il metodo su localhost con una porta? –

Problemi correlati