2011-08-29 16 views
6

Ho il codice di routing seguente:.NET MVC routing w/URL Encoding Problemi

routes.MapRoute(
      "email-validated/{sessionId}", 
      "email-validated/{sessionId}", 
      new { controller = "User", action = "EmailValidated", sessionId = UrlParameter.Optional } 
      ); 

Quando mi ha colpito la strada w/qualcosa che è URL codificato non corrisponderà il percorso per 2F%,% 2b e alcuni altri personaggi fuggiti. Inoltre non corrisponderà per non url codificato (cose w/+, ecc) Ad esempio

Questo funziona:

email convalidato/XQiKC6KMM% 2cmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

questo non funziona (containts% 2F ecc):

email-validated/XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 

Questo non funziona (contiene +, ecc)

email-validated/XQiKC6KMM+mko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 
+0

come stai generando questo SessionId? – hunter

+0

È necessario utilizzare un GUID anziché quella stringa. Sembra molto casuale e ha la possibilità di contenere non solo caratteri mal codificati ma anche caratteri <> che invalidano la richiesta. –

+0

la sessione è una stringa casuale che è quindi codificata 64 base e quindi HttpUtilty.UrlEncoded. Sto lavorando con il porting di un sito legacy a mvc 3 e sarebbe estremamente difficile ricodificare come funzionano gli ID di sessione, purtroppo ho bisogno di una soluzione per questo :( –

risposta

3

Sembra che il percorso di instradamento maneggi stranamente i caratteri di escape/'s e +'. Provare a passarlo come argomento di una stringa di query.

Fai la tua endpoint:

routes.MapRoute(
      "email-validated", 
      "email-validated", 
      new { controller = "User", action = "EmailValidated" } 
      ); 

chiamata con una richiesta del tipo:

email-validated/?sessionId=XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 

e quindi modificare la funzione da

EmailValidatedFunction(string sessionId) 
{ 
    //...do stuff with sessionId here 
} 

a:

EmailValidatedFunction() 
{ 
    string sessionId = Request["sessionId"]; 
    //...do stuff with sessionId here 
} 
6

Se è possibile, è necessario rendere sicuro l'URL di sessione. Il sessionId è codificato Base64, e ci sono tre caratteri problema URL in Base64, "/", "+" e "=". Utilizzare la seguente per codificare il sessionId quando si crea il tuo link:

public string ToUrlSafeBase64String(string Base64String) 
    { 
     // avoid any slashes, plus signs or equal signs 
     // the following makes this base64 string url safe 
     Base64String = Base64String.Replace("/", "_"); 
     Base64String = Base64String.Replace("+", "-"); 
     return Base64String.Replace("=", String.Empty); 
    } 

Quindi, utilizzare il seguente per ricreare la stringa Base64 originale codificato:

public string FromUrlSafeBase64String(string Base64String) 
    { 
     // add back any slashes, plus signs or equal signs 
     // the following makes this url safe string a base64 string 
     Base64String = Base64String.Replace("_", "/"); 
     Base64String = Base64String.Replace("-", "+"); 
     return Base64String.PadRight(Base64String.Length + (4 - Base64String.Length % 4) % 4, '='); 
    } 
+1

Penso che questa sia la migliore soluzione dei due. – YesMan85

+0

L'altra risposta è come dire se la tua auto fa uno strano rumore, lasciarlo da solo e smettere di guidarlo. Questo dice aprire il cofano e riparare X. Grazie, esattamente quello di cui avevo bisogno! – Mortana

0

Ecco la soluzione che ho trovato per consentire url caratteri codificati come la barra diretta %2f in URL MVC Asp.Net.

Aggiungere il seguente al metodo del file Global.asaxApplication_BeginRequest:

var realUrl = Request.ServerVariables["HTTP_URL"]; 
Context.RewritePath(realUrl); 

Dal momento che questo accade prima MVC routing, si sarà in grado di fare quello che in origine voleva fare.

Ricorda solo che dovrai decodificare manualmente i parametri nei tuoi metodi di azione per ottenere il loro valore reale (dal momento che stiamo impedendo al framework di farlo).