2011-08-29 27 views
6

Tengo el siguiente código de enrutamiento:.NET MVC enrutamiento w/codificación URL Problemas

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

Cuando llegué a la ruta w/algo que se URL codificada que no coincidirá con la ruta de 2f%,% 2b y algunos otros personajes escapados. También no coincidirá con la no URL codificada (cosas w/+, etc.) Por ejemplo

Esto funciona:

correo electrónico validada/XQiKC6KMM% 2cmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

esto no funciona (containts% 2F etc):

email-validated/XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 

Esto no funciona (+ contiene etc)

email-validated/XQiKC6KMM+mko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 
+0

cómo estás generando este SessionId? – hunter

+0

Debe usar un GUID en lugar de esa cadena. Parece muy aleatorio y tiene la posibilidad no solo de contener caracteres mal codificados, sino también de caracteres <> que invalidan la solicitud. –

+0

la sesión es una cadena aleatoria codificada en base 64 y luego HttpUtilty.UrlEncoded. Estoy trabajando con portar un sitio heredado a mvc 3 y sería extremadamente difícil volver a codificar el funcionamiento lamentable de las ID de sesión, así que necesito una solución para esto :( –

Respuesta

3

Parece que la ruta de acceso maneja las escapadas/'s y +' s de forma extraña. Intente pasarlo como un argumento de cadena de consulta en su lugar.

Haga su punto final:

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

de llamadas con una petición como:

email-validated/?sessionId=XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso 

Y a continuación, cambiar su función a partir de

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

a:

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

Si puede, debe proteger la URL de sessionId. La sessionId está codificada en Base64, y hay tres caracteres con problemas de URL en Base64, "/", "+" y "=". Utilice el siguiente para codificar el sessionId al crear el enlace:

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); 
    } 

A continuación, utilice el siguiente para volver a crear la cadena Base64 original codificado:

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

Creo que esta es la mejor solución de las dos. – YesMan85

+0

La otra respuesta es como decir si su automóvil hace un ruido extraño, dejarlo solo y dejar de conducirlo. Este dice abrir el capó y arreglar X. ¡Gracias, exactamente lo que necesitaba! – Mortana

0

Aquí está la solución que he encontrado para permitir caracteres codificados en URL como la barra diagonal %2f en Asp.Net MVC urls.

Añadir el siguiente al método de su archivo Global.asaxApplication_BeginRequest:

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

Dado que esto ocurre antes de MVC enrutamiento, usted será capaz de hacer lo que originalmente quería hacer.

Recuerde que necesitará decodificar manualmente los parámetros en sus métodos de acción para obtener su valor real (ya que estamos evitando que el marco de trabajo lo haga).