none
¿Como puedo encriptar parametros querystring? RRS feed

  • Pregunta

  • Hola a todos:

    En realidad la pregunta es más:

    ¿Dispone mvc3 algún mecanismo para la encriptación desencriptación del querystring?

    Ahora mismo lo hago con una librería mía, pero me parece muy extraño que el propio framework no proporcione una utilidad para hacerlo.

    Gracias de antemano

    martes, 3 de julio de 2012 12:04

Respuestas

  • Mmmmm....

    > ¿Y si la url es amigable?

    En este caso, no tienes querystring, pero lo que tienes son route values (valores de ruta). En ASP.NET MVC un route value es un valor que se establece a partir de la tabla de rutas. Usando la definición estándard tenemos básicamente un solo route value que es id (además de los valores de ruta "de sistema", que son la accion (action) y el controlador (controller). Uno de los value providers que existen por defecto en ASP.NET MVC se encarga de recoger esos valores de ruta y colocarlos "en este sitio común". En este caso puedes colocar la desencriptación en dos sitios distintos: en un custom route handler o en un value provider propio, siguiendo la técnica del post. La diferencia es que con el primero puedes tener también encriptados el nombre del controlador y la acción y en el segundo, no.

    En el fondo esta clase encargada de procesar las urls que te has imaginado tu, existe en ASP.NET MVC y es el route handler. Pero sus responsabilidades se limitan al PathInfo (es decir la parte de la url "amigable"). El route handler no procesa querystring (ni otros datos de la request como formdata). Piensa que ASP.NET MVC intenta que el desarrollador no deba preocuparse de si un dato está en la querystring, en el pathinfo, en formdata o donde sea: si hay un parámetro en la acción correspondiente con el mismo nombre, ASP.NET MVC enlaza dicho parámetro con el valor de la request (esté donde esté). Y esto se consigue precisamente gracias a los value providers.

    Entonces la separación de responsabilidades en ASP.NET MVC está muy clara:

    1. Route handler: Procesa la URL y genera los valores de ruta. Se limita al PathInfo ya que es el único sitio donde pueden haber valores de ruta.
    2. Value Providers: Procesan la petición http y se encargan de poner todos los datos en "un sitio común".
    3. Model Binder: Recoge los datos "de este sitio común" y los enlaza con los parámetros de las acciones.

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta BenitoCotito jueves, 5 de julio de 2012 23:00
    miércoles, 4 de julio de 2012 6:34

Todas las respuestas

  • Buenas!

    La respuesta básica es no, el framework no tiene nada built-in para eso :)

    Yo lo montaría a través de un value provider propio y luego helpers propios para generar las URLs encriptadas de forma sencilla.

    He dejado un post en mi blog comentando dicha aproximación: http://geeks.ms/blogs/etomas/archive/2012/07/03/asp-net-mvc-encriptar-la-query-string.aspx

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta BenitoCotito martes, 3 de julio de 2012 21:21
    • Desmarcado como respuesta BenitoCotito jueves, 5 de julio de 2012 22:46
    martes, 3 de julio de 2012 20:10
  • Eres un crack Eduard¡¡

    Eso facilita bastante las cosas¡¡

    De todas formas soy un poco iluso. Pensaba que existiría una clase responsable de procesar las urls get y set, y que esta estaría relacionado con los maproutes. En mi imaginación, pensaba que podriamos sobreescribir el metodo get y set (de esta clase imaginaria que me saqué de la manga) para que encriptara y desencriptara los parametros en una url, ya que el maproute le indicaba cual de los elementos de la url eran parametros, y cual era controlador y acción. Y como mi imaginación no tiene limite :D, pensaba que tipando los parametros en el maproute, esos metodos podrían hacer el intento de parseo después de desencriptarlos, en el caso que diese una excepción, solo tenía que controlarla y listo.

    Como puedes ver, imaginación no me falta¡ :D

    Voy a leerme a fondo tu post, pero así por encima, me surge una duda. ¿Y si la url es amigable?
    ¿El value provider se encarga de obtenerlos utilizando el maproute?

    Perdona mi ignorancia y muuuuchas gracias por ayudarme.

    martes, 3 de julio de 2012 21:01
  • Mmmmm....

    > ¿Y si la url es amigable?

    En este caso, no tienes querystring, pero lo que tienes son route values (valores de ruta). En ASP.NET MVC un route value es un valor que se establece a partir de la tabla de rutas. Usando la definición estándard tenemos básicamente un solo route value que es id (además de los valores de ruta "de sistema", que son la accion (action) y el controlador (controller). Uno de los value providers que existen por defecto en ASP.NET MVC se encarga de recoger esos valores de ruta y colocarlos "en este sitio común". En este caso puedes colocar la desencriptación en dos sitios distintos: en un custom route handler o en un value provider propio, siguiendo la técnica del post. La diferencia es que con el primero puedes tener también encriptados el nombre del controlador y la acción y en el segundo, no.

    En el fondo esta clase encargada de procesar las urls que te has imaginado tu, existe en ASP.NET MVC y es el route handler. Pero sus responsabilidades se limitan al PathInfo (es decir la parte de la url "amigable"). El route handler no procesa querystring (ni otros datos de la request como formdata). Piensa que ASP.NET MVC intenta que el desarrollador no deba preocuparse de si un dato está en la querystring, en el pathinfo, en formdata o donde sea: si hay un parámetro en la acción correspondiente con el mismo nombre, ASP.NET MVC enlaza dicho parámetro con el valor de la request (esté donde esté). Y esto se consigue precisamente gracias a los value providers.

    Entonces la separación de responsabilidades en ASP.NET MVC está muy clara:

    1. Route handler: Procesa la URL y genera los valores de ruta. Se limita al PathInfo ya que es el único sitio donde pueden haber valores de ruta.
    2. Value Providers: Procesan la petición http y se encargan de poner todos los datos en "un sitio común".
    3. Model Binder: Recoge los datos "de este sitio común" y los enlaza con los parámetros de las acciones.

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta BenitoCotito jueves, 5 de julio de 2012 23:00
    miércoles, 4 de julio de 2012 6:34
  • Perfecto¡¡

    Me acabas de aclarar las dudas que tenía al respecto, y desde mi punto de vista eran lógicas. El problema era mi desconocimiento¡ :)

    Si te he entendido bien, puedo utilizar el value provider para obtener mis parametros y desencriptarlos (tal y como expones en tu blog y aunque la url sea amigable), pero hay una parte que no soy capaz de visualizar. No logro ver como implementar la funcionalidad para automatizar la encriptación de los parametros de salida.

    ¿Es posible hacerlo?

    Muchas gracias por tu ayuda y paciencia Eduard

    miércoles, 4 de julio de 2012 11:32
  • Buenas!

    Entiendo que por automatizar la "encriptación de los parámetros de salida" te refieres a generar URLs encriptadas de forma fácil.

    Bien, la única solución que veo pasa por definirte tus propios helpers que lo hagan. Así en lugar de @Url.Action para obtener una URL tendrás un helper tuyo @Url.ActionEncrypted p.ej. Y lo mismo aplica a Html.ActionLink y similares (si los usas).

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta BenitoCotito miércoles, 4 de julio de 2012 11:45
    • Desmarcado como respuesta BenitoCotito jueves, 5 de julio de 2012 22:46
    miércoles, 4 de julio de 2012 11:40
  • Pues si, ahora lo entiendo todo.

    Esto es justo lo que quería hacer¡¡

    Muchisimas gracias¡¡

    miércoles, 4 de julio de 2012 11:45