我想使用RequireHttpsAttribute来防止不安全的超文本传输协议请求被发送到动作方法。
C#
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
不幸的是,HTTPS不支持ASP.NET。
如何使我的ASP.NET MVC应用程序在发布到生产环境时使用RequireHttps,而不是在我的ASP.NET development Server上的开发工作站上运行时使用?
发布于 2009-10-29 04:13:56
如果您在开发工作站上运行发布构建,这将没有帮助,但条件编译可以完成这项工作……
#if !DEBUG
[RequireHttps] //apply to all actions in controller
#endif
public class SomeController
{
//... or ...
#if !DEBUG
[RequireHttps] //apply to this action only
#endif
public ActionResult SomeAction()
{
}
}
更新
在Visual Basic中,从技术上讲,属性与它们所应用的定义属于同一行。您不能将条件编译语句放在一行中,因此必须编写两次函数声明-一次使用属性,另一次不使用属性。但是,如果你不介意它的丑陋,它确实起作用了。
#If Not Debug Then
<RequireHttps()> _
Function SomeAction() As ActionResult
#Else
Function SomeAction() As ActionResult
#End If
...
End Function
更新2
有几个人提到了从RequireHttpsAttribute
派生,但没有提供示例,所以这里有一个示例。我认为这种方法会比条件编译方法干净得多,而且我更倾向于您的立场。
免责声明:我没有测试过这段代码,甚至一点也没有,而且我的VB相当生疏。我只知道它会编译。我是根据spot,queen3和Lance Fisher的建议写的。如果它不起作用,它至少应该传达一般的想法,并给你一个起点。
Public Class RemoteRequireHttpsAttribute
Inherits System.Web.Mvc.RequireHttpsAttribute
Public Overrides Sub OnAuthorization(ByVal filterContext As _
System.Web.Mvc.AuthorizationContext)
If IsNothing(filterContext) Then
Throw New ArgumentNullException("filterContext")
End If
If Not IsNothing(filterContext.HttpContext) AndAlso _
filterContext.HttpContext.Request.IsLocal Then
Return
End If
MyBase.OnAuthorization(filterContext)
End Sub
End Class
基本上,如果当前请求是本地的(即通过localhost访问站点),新属性就会退出,而不是运行默认的SSL授权码。你可以这样使用它:
<RemoteRequireHttps()> _
Public Class SomeController
<RemoteRequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
干净多了!只要我的未测试代码能正常工作。
发布于 2011-05-03 23:45:08
如果有人需要C#版本:
using System;
using System.Web.Mvc;
namespace My.Utils
{
public class MyRequireHttpsAttribute : RequireHttpsAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext != null && filterContext.HttpContext.Request.IsLocal)
{
return;
}
base.OnAuthorization(filterContext);
}
}
}
发布于 2009-10-29 05:08:11
从RequireHttps派生是一个很好的方法。
为了完全避免这个问题,您也可以在本地计算机上使用IIS和自签名证书。IIS比内置的you服务器更快,而且您的优势在于开发环境更像是生产环境。
https://stackoverflow.com/questions/1639707
复制相似问题