除了简单地从HTTP重定向到HTTPS之外,RequireHttps属性还会将我的网址问号?
更改为%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
。
答案 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
没有问号。没问题。