Как зашифровать параметры URL в MVC - PullRequest
1 голос
/ 19 марта 2011

Я пытаюсь зашифровать параметры URL-адреса путем реализации EncryptedActionLink, которая возвращает ссылку с зашифрованным параметром "p" на общее действие "ResolveUrl". Контроллер должен получить запрос и вызвать соответствующее действие или перенаправить его к действующему действию, не показывая впоследствии незашифрованные значения в адресной строке (RedirectToAction из-за этого не работает).

Пока что я сделал этот метод расширения:

    public static MvcHtmlString EncryptedActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
    {
        var RouteValueDictionary = new RouteValueDictionary(routeValues);

        RouteValueDictionary.Add("actionName", actionName);
        RouteValueDictionary.Add("noise", new Random().Next(5000,10000));

        var routeValuesText = RouteTable.Routes.GetVirtualPath(null, RouteValueDictionary).VirtualPath;            
        var Encryption64 = new Encryption64();
        var routeValuesTextCrypto = Encryption64.Encrypt(routeValuesText, "ABC123AB");

        return htmlHelper.ActionLink(linkText, "ResolveUrl", controllerName, new { p = routeValuesTextCrypto }, htmlAttributes);
    }

используя этот метод, я получаю следующий URL:

<%: Html.EncryptedActionLink("MyText", "MyAction", "MyContoller", new { Parameter1 = 123, Parameter2 = "String", Parameter3 = false }, null)%>

http://localhost:21536/MyContoller/ResolveUrl?p=iqo6yhy0Zl3jZXdMmnJ9KdvQhqCb5X6gg19%2FqZ8XUe19r5PJ6xO84plZr1GUHCHNY9h2SDO1o4CaF9W2DdmpywXooEQ1S0rNYjpnH4s3wb%2FqM8sGxoqAqyIoC%2F2nqW7U

Теперь все мои контроллеры наследуются от ContollerBase. Там я определяю действие ResolveUrl следующим образом:

public ActionResult ResolveUrl(String p)
        {
            var Encryption64 = new Encryption64();
            var query = Encryption64.Decrypt(p, "ABC123AB");

            if (query.Length > 2)
                query = query.Substring(2);

            var tokens = query.Split(new String [] { "&" }, StringSplitOptions.RemoveEmptyEntries);
            var RouteValueDictionary = new RouteValueDictionary();

            for (int i = 0; i < tokens.Count(); i++)
            {
                var centerPos = tokens[i].IndexOf("=");
                RouteValueDictionary.Add(tokens[i].Substring(0,centerPos),tokens[i].Substring(centerPos+1));
            }

            Type thisType = this.GetType();
            MethodInfo theMethod = thisType.GetMethod(RouteValueDictionary["actionName"].ToString());
            var theParameters = theMethod.GetParameters();
            var theParametersObject = new object[theParameters.Count()];

            System.ComponentModel.TypeConverter converter = new System.ComponentModel.TypeConverter();

            for (int i=0 ; i<theParameters.Count();i++)
            {
                theParametersObject[i] = converter.ConvertTo(RouteValueDictionary[theParameters[i].Name],theParameters[i].ParameterType);
            }

            return (ActionResult)theMethod.Invoke(this, theParametersObject);
        }

Суть этого кода в том, что ResolveUrl не работает. Во-первых, когда есть две реализации для одного действия (POST / GET), генерируется исключение. И вторая вещь, которая терпит неудачу, является преобразованием типа параметра (для примера преобразования из строки в обнуляемый тип).

Как я могу зашифровать параметры URL? Полезен ли мой код? Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 16 апреля 2014

Если вы пытаетесь зашифровать параметры URL-адреса (значения маршрута), вы можете использовать пользовательский valueedatrovider, который автоматически расшифровывает значение в действии, не показывая незашифрованное значение в адресной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...