RequireHttps не работает на перенаправлениях с параметрами

Помимо простого перенаправления с HTTP на HTTPS, атрибут RequireHttps также меняет вопросительный знак моего URL ? в %3F, Неудивительно, что это ломает вещи.

Зачем? Как мне это исправить?

сценарий:

  1. Я пытаюсь перейти к http://www.example.com/message/compose

  2. Но допустим, у меня нет разрешения на просмотр этой страницы.

    <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
    
  3. Действие выдает исключение.

  4. Исключение обрабатывается моей страницей 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>
    
    ...
    
  5. Я перенаправлен на свою страницу входа в http://www.example.com/signin?ReturnUrl=%2fmessage%2fcompose

  6. Но я использую 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
    
  7. Я перенаправлен на https://www.example.com/signin%3FReturnUrl=%2fmessage%2fcompose

  8. Я вижу эту ошибку в моем браузере:

Неверный запрос

Похоже, что 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

Нет знака вопроса. Нет проблем.

Другие вопросы по тегам