Маршрутизация .NET MVC с проблемами кодирования URL - PullRequest
8 голосов
/ 29 августа 2011

У меня есть следующий код маршрутизации:

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

Когда я вхожу в маршрут с кодом, закодированным в URL, он не будет соответствовать маршруту для% 2f,% 2b и некоторых других экранированных символов. Это также не будет соответствовать для не закодированных URL (вещи с / + и т. Д.) Например,

Это работает:

Адрес электронной почты апробированы / XQiKC6KMM% 2cmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

Это не работает (содержит% 2f и т. Д.):

email-validated/XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

Это не работает (содержит + и т.д.)

email-validated/XQiKC6KMM+mko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

Ответы [ 4 ]

7 голосов
/ 30 августа 2011

Если вы можете, вы должны сделать свой URL-адрес sessionId безопасным.Идентификатор сеанса имеет кодировку Base64, и в Base64 есть три символа проблемы URL: «/», «+» и «=».Используйте следующее для кодирования вашего sessionId при создании ссылки:

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

Затем используйте следующее, чтобы заново создать исходную строку в кодировке Base64:

    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, '=');
    }
3 голосов
/ 30 августа 2011

Похоже, что пути маршрутизации обработаны экранированными / и + странно.Попробуйте вместо этого передать его в качестве аргумента строки запроса.

Создайте свою конечную точку:

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

Вызовите ее с помощью запроса:

email-validated/?sessionId=XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

И затем измените свойфункция от

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

до:

EmailValidatedFunction()
{
   string sessionId = Request["sessionId"];
   //...do stuff with sessionId here
}
0 голосов
/ 20 ноября 2014

вы можете использовать System.Web.HttpServerUtility.UrlTokenEncode (от http://brockallen.com/2014/10/17/base64url-encoding/#comments)

0 голосов
/ 03 сентября 2013

Вот решение, которое я нашел, чтобы разрешить символы, закодированные в URL, такие как косая черта %2f в URL-адресах Asp.Net MVC.

Добавьте следующее к Application_BeginRequest методу вашего Global.asax файла:

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

Так как это происходит до маршрутизации MVC, вы сможете делать то, что изначально хотели делать.

Просто помните, что вам нужно вручную декодировать параметры в ваших методах действия, чтобы получить их фактическое значение (поскольку мы не позволяем платформе это сделать).

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