2014-12-24 5 views
2

Я создаю метод действия ASP.NET MVC5, который реализует конечную точку сброса пароля и принимает клик через сообщение электронной почты, содержащее токен. В моей реализации используется промежуточное ПО OWIN и очень похоже на ASP.NET Identity 2.1 samples application.ASP.NET MVC5 OWIN отклоняет длинные URL-адреса

В соответствии с приложением образцов, маркер генерируется UserManager и заливал в URL, который отправляется пользователю по электронной почте:

var token = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
var encoded = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(token)); 
var uri = new Uri(Url.Link("ResetPasswordRoute", new { id = user.Id, token = encoded })); 

Ссылка в сообщении электронной почты предназначается для конечной точки MVC, который принимает маркер параметра в качестве одного из сегментов маршрута:

[Route("reset-password/{id}/{token}"] 
public async Task<ActionResult> PasswordResetAsync(int id, string token) 
{ 
    token = Encoding.UTF8.GetString(HttpServerUtility.UrlTokenDecode(token)); 

    // Implementation here 
} 

Однако запросы на эту конечную точку (с использованием URL сгенерированный указанным выше образом) потерпит неудачу с Bad Request - Invalid URL.

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

http://localhost:53717/account/reset-password/5/QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFzcko5MEJnYWlrR1RydnVoY2ZwNEpnQUFBQUFDQUFBQUFBQVFaZ0FBQUFFQUFDQUFBQUNVeGZZMzd4OTQ3cE03WWxCakIwRTl4NkVSem1Za2ZUc1JxR2pwYnJSbmJ3QUFBQUFPZ0FBQUFBSUFBQ0FBQUFEcEpnVXFXS0dyM2ZPL2dQcWR1K2x6SkgxN25UVjdMYlE2UCtVRG4rcXBjU0FBQUFE 

... но это не получится, если добавить один дополнительный символ ...

http://localhost:53717/account/reset-password/5/QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFzcko5MEJnYWlrR1RydnVoY2ZwNEpnQUFBQUFDQUFBQUFBQVFaZ0FBQUFFQUFDQUFBQUNVeGZZMzd4OTQ3cE03WWxCakIwRTl4NkVSem1Za2ZUc1JxR2pwYnJSbmJ3QUFBQUFPZ0FBQUFBSUFBQ0FBQUFEcEpnVXFXS0dyM2ZPL2dQcWR1K2x6SkgxN25UVjdMYlE2UCtVRG4rcXBjU0FBQUFEf 

Я считаю, что установка конфигурации по умолчанию IIS для maxUrlLength должен быть совместим с тем, что я пытаюсь сделать, но я также попытался явно установить его на большее значение, которое не решило проблему.

Однако с помощью Fiddler для изучения ответа сервера, я могу видеть, что рабочий URL генерирует ответ сервера со следующим заголовком ...

Server: Microsoft-IIS/8.0 

... в то время как более URL отвергается с ответ, содержащий следующий заголовок ...

Server: Microsoft-HTTPAPI/2.0 

Это, кажется, подразумевает, что URL не будучи отклонение от IIS, но компонент промежуточного программного обеспечения.

Итак, мне интересно, что это за компонент и как я могу обойти его эффект.

Любые предложения, пожалуйста?

Большое спасибо, Tim

Примечание: Хотя моя реализация выше Base64 кодирует маркер перед его использованием в URL, я также экспериментировал с более простым подходом, используемым в примере кода, который основан на кодировании URL предоставлено UrlHelper.RouteUrl. Оба метода страдают от одной и той же проблемы.

ответ

3

Вы не должны передавать такие длинные значения в пути приложения URL-адреса, поскольку они ограничены длиной до 255 символов.

Несколько лучшей альтернативой является использование параметра строки запроса вместо:

http://localhost:53717/account/reset-password/5?token=QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFzcko5MEJnYWlrR1RydnVoY2ZwNEpnQUFBQUFDQUFBQUFBQVFaZ0FBQUFFQUFDQUFBQUNVeGZZMzd4OTQ3cE03WWxCakIwRTl4NkVSem1Za2ZUc1JxR2pwYnJSbmJ3QUFBQUFPZ0FBQUFBSUFBQ0FBQUFEcEpnVXFXS0dyM2ZPL2dQcWR1K2x6SkgxN25UVjdMYlE2UCtVRG4rcXBjU0FBQUFEf

Это должно быть безопасным, по крайней мере 2000 символов (полный URL) в зависимости от браузера и IIS настройки.

Более безопасный и масштабируемый подход заключается в передаче токена внутри HTTP-заголовка.

+2

Вы не можете передать заголовок с токеном по ссылке в электронном письме. – trailmax

+0

Спасибо - я попробовал ваше предложение, и оно отлично работает. –

Смежные вопросы