使用参数重定向时,RequireHttps失败

时间:2009-10-29 19:26:48

标签: asp.net-mvc ssl https

除了简单地从HTTP重定向到HTTPS之外,RequireHttps属性还会将我的网址问号?更改为%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. 的登录页面
  7. 但我使用的是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
    
  8. 我被重定向到https://www.example.com/signin%3FReturnUrl=%2fmessage%2fcompose

  9. 我在浏览器中看到此错误:

  10.   

    错误请求

    似乎RequireHttps将我的问号?更改为%3F

3 个答案:

答案 0 :(得分:1)

我们正在考虑使用像ISAPI Rewrite之类的网址重写器来处理这些事情,然后再访问代码。当然,这只有在您有权访问服务器时才有效。

此外,如果您使用的是IIS 7,我相信它内置了URL重写功能。

答案 1 :(得分:1)

我的answer to my own question可能有帮助(似乎是MVC 2 Preview 2中的错误)

我可以问你为什么不使用[授权]或custom authorization attribute。如果您使用的是.NET身份验证,则应使用[授权]。

注意:即使您使用[授权],它也无法解决您遇到的问题。

答案 2 :(得分:0)

我刚刚重新设计了这个以避免问号(以及异常抛出)。

情形:

我尝试导航到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

没有问号。没问题。