none
Problema modificando los valores de querystring en url amigable RRS feed

  • Pregunta

  • Hola:

    Lo que quiero es poder encriptar y desencriptar los parametros en las url amigables. He conseguido montar el helper para encriptar los parametros en los links, pero a la hora de desencriptarlos no he sido capaz de hacerlo.

    Este es el código para encriptar los parametros:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using es.v_mann.util.Security.Crypt;
    using es.v_mann.util.Security.Decrypt;
    using System.Web.Routing;
    
    
            namespace System.Web.Mvc.Html
            {
                public static class Html
                {
                    public static MvcHtmlString EncryptedRouteLink(
                            this HtmlHelper htmlHelper,
                            string linkText,
                            string className,
                            object routeValues
                        )
                    {
                        // Convert the routeValues to something we can modify.
                        var routeValuesLocal =
                            routeValues as IDictionary<string, object>
                            ?? new RouteValueDictionary(routeValues);
    
                        Encrypt e = new Encrypt();
                        
                        var routesCripted = new RouteValueDictionary();
                        foreach (var a in routeValuesLocal) {
                            routesCripted.Add(a.Key, e.Encrypt(Convert.ToString(a.Value), "eci15302144"));
                        }
    
    
                        return MvcHtmlString.Create(htmlHelper.RouteLink(linkText, className, routesCripted).ToHtmlString());
                        
                    }
    
                }
            }

    La encriptación es una simulación, pero evidentemente puede ser cualquier otra utilidad para encriptar.

    El probema lo tengo a la hora de desencriptar. He conseguido hacerlo en el caso de los actionlink, pero no para los routelink. El codigo es el siguiente:

    Para la factoria:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
        public class QSEncriptedValueProviderFactory : ValueProviderFactory
        {
            public override IValueProvider GetValueProvider(ControllerContext controllerContext)
            {
                return new QSEncriptedValueProvider(controllerContext);
    
            }
    
        }

    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Threading;
    using System.Web.Routing;
    
        public class QSEncriptedValueProvider : DictionaryValueProvider<string>
        {
    
            public QSEncriptedValueProvider(ControllerContext controllerContext) : base(GetQSDictionary(controllerContext), Thread.CurrentThread.CurrentCulture)
            {
    
            }
    
            private static IDictionary<string, string> GetQSDictionary(ControllerContext controllerContext)
            {
    
    
    
                es.v_mann.util.Security.Decrypt.Decrypt e = new es.v_mann.util.Security.Decrypt.Decrypt();
    
    
                var dict = new Dictionary<string, string>();
    
                var req = controllerContext.HttpContext.Request;
    
                foreach (var key in req.QueryString.AllKeys)
                {
                    if (key != "controller" & key != "action")
                    {
                        var value = req.QueryString[key];
    
                        dict.Add(key.Substring(1), e.Decrypt(value, "eci15302144"));
                    }
                    else {
                        var value = req.QueryString[key];
    
                        dict.Add(key.Substring(1), value);
                    }
                }
    
                return dict;
    
            }
    
        }

    El diccionario que retorna tiene los valores adecuados, pero estoy convencido que no utilizo el objeto adecuado y seguramente el ambito tampoco.

    jueves, 5 de julio de 2012 22:59

Respuestas

  • Buenas!

    Te he intentado responder en mi blog: http://geeks.ms/blogs/etomas/archive/2012/07/08/asp-net-mvc-encriptar-routevalues.aspx

    Comentarte tan solo que si tienes "url amigables" no tienes querystring (bueno, realmente puedes combinarlos pero no es muy común). La querystring es lo que empieza justo después del interrogante.

    Si lo que pretendes es encriptar la parte "amigable" de la URL tienes dos opciones: o value provider o custom route handler. Ambas están descriptas en el post.

    Un saludo!



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

    • Marcado como respuesta BenitoCotito domingo, 8 de julio de 2012 22:43
    domingo, 8 de julio de 2012 16:41