RequireHttps не работает на перенаправлениях с параметрами - PullRequest
0 голосов
/ 29 октября 2009

Помимо простого перенаправления с 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 ]

1 голос
/ 06 ноября 2009

Мой ответ на мой собственный вопрос здесь может помочь (кажется, ошибка в MVC 2 Preview 2)

Могу ли я спросить, почему вы не используете [Авторизовать] или пользовательский атрибут авторизации . Если вы используете .NET-аутентификацию, вы должны использовать [Authorize].

Примечание: даже если вы используете [Авторизация], это фактически не решает проблему, с которой вы столкнулись.

1 голос
/ 29 октября 2009

Мы рассматриваем возможность использования средства переписывания URL-адресов, например ISAPI Rewrite , для обработки подобных вещей до того, как они попадут в ваш код. Конечно, это будет работать, только если у вас есть доступ к серверу.

Кроме того, если вы используете IIS 7, я полагаю, что он имеет встроенную функцию перезаписи URL.

0 голосов
/ 30 октября 2009

Я только что перестроил это, чтобы вообще избежать вопросительного знака (а также исключения)

сценарий:

Я пытаюсь перейти к 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

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

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