RequireHttps не работает на перенаправлениях с параметрами
Помимо простого перенаправления с HTTP на HTTPS, атрибут RequireHttps также меняет вопросительный знак моего URL ?
в %3F
, Неудивительно, что это ломает вещи.
Зачем? Как мне это исправить?
сценарий:
Я пытаюсь перейти к
http://www.example.com/message/compose
Но допустим, у меня нет разрешения на просмотр этой страницы.
<HandleError()> _ Public Class MessageController Inherits System.Web.Mvc.Controller Function Compose() As ActionResult ... If ... Then Throw New Exception(Net.HttpStatusCode.Unauthorized.ToString) End If ... Return View() End Function ... End Class
Действие выдает исключение.
Исключение обрабатывается моей страницей Error.aspx
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of System.Web.Mvc.HandleErrorInfo)" %> <script runat="server"> Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs) If Model.Exception.Message = Net.HttpStatusCode.Unauthorized.ToString Then response.redirect("/signin?ReturnUrl=" + Url.Encode(request.Path)) End If ... End Sub </script> ...
Я перенаправлен на свою страницу входа в
http://www.example.com/signin?ReturnUrl=%2fmessage%2fcompose
Но я использую HTTP, а не HTTPS. Мое действие требует HTTPS. (Этот RemoteRequireHttps наследуется от RequireHttps и переопределяет его метод OnAuthorization, чтобы просто игнорировать localhost.)
<HandleError()> _ Public Class AccountController Inherits System.Web.Mvc.Controller <RemoteRequireHttps()> _ Function SignIn() As ActionResult ... End Function ... End Class
Я перенаправлен на
https://www.example.com/signin%3FReturnUrl=%2fmessage%2fcompose
Я вижу эту ошибку в моем браузере:
Неверный запрос
Похоже, что RequireHttps меняет мой знак вопроса ?
в %3F
,
3 ответа
Мы рассматриваем возможность использования средства перезаписи URL-адресов, например ISAPI Rewrite, для обработки подобных вещей до того, как они попадут в ваш код. Конечно, это будет работать, только если у вас есть доступ к серверу.
Кроме того, если вы используете IIS 7, я считаю, что он поставляется с встроенной функцией перезаписи URL.
Мой ответ на мой собственный вопрос здесь может помочь (кажется, ошибка в MVC 2 Preview 2)
Могу я спросить, почему вы не используете [Авторизация] или пользовательский атрибут авторизации. Если вы используете.NET-аутентификацию, вы должны использовать [Authorize].
Примечание: даже если вы используете [Авторизация], это на самом деле не решает проблему, с которой вы столкнулись.
Я только что перестроил это, чтобы вообще избежать вопросительного знака (а также исключений).
сценарий:
Я пытаюсь перейти к http://www.example.com/message/compose
Но допустим, у меня нет разрешения на просмотр этой страницы.
Public Class MessageController
Inherits System.Web.Mvc.Controller
Function Compose() As ActionResult
...
If ... Then
Return RedirectToAction("SignIn", "Account", New With {.ReturnUrl = Request.Path})
End If
...
Return View()
End Function
...
End Class
Я перенаправлен на мою страницу входа. Мой маршрут выглядит так:
routes.MapRoute( _
"SignIn", _
"signin/{*ReturnUrl}", _
New With {.controller = "Account", _
.action = "SignIn", _
.ReturnUrl = ""} _
)
Так что по адресу http://www.example.com/signin/message/compose
Но я использую HTTP, а не HTTPS. Мое действие требует HTTPS.
Public Class AccountController
Inherits System.Web.Mvc.Controller
<RemoteRequireHttps()> _
Function SignIn(ByVal ReturnUrl As String) As ActionResult
...
End Function
...
End Class
Я перенаправлен на https://www.example.com/signin/message/compose
Нет знака вопроса. Нет проблем.