ASP MVC 3 RequireHttps属性将所有链接更改为https

时间:2012-03-15 12:26:38

标签: asp.net-mvc hyperlink actionlink requirehttps

我有一个ASP MVC 3网站,它有一个反馈表,应该要求SSL。

现在,我在名为“ContactUs”的控制器中有一个名为Feedback的操作,负责查看和处理反馈。

当我在该操作上使用[RequireHttps]属性时,它运行良好,并将URL更改为“https”。但是,我注意到我页面中的所有链接现在都指向“https”!好像这个属性迫使路由引擎将它应用于所有链接!!!

当然,SSL只需要执行此单个操作,其余所有操作都需要具有正常的http。

有谁能告诉我如何解决这个问题?

2 个答案:

答案 0 :(得分:13)

如果您清除了登录cookie,那么[RequireHttp]属性可能没问题 - 或者您将通过网络以明文形式发送它。为避免进一步的HTTPS调用的轻微成本,可能需要做更多的工作而不是值得。所有关于回收问题的内容都是如此,阅读问题的其他用户可能认为在登录后下载到HTTP是可以的,这通常是错误的。

可以在控制器类型或操作方法上使用[RequireHttps]属性来说“只能通过SSL访问”。对控制器或操作的非SSL请求将被重定向到SSL版本(如果是HTTP GET)或被拒绝(如果是HTTP POST)。您可以覆盖RequireHttpsAttribute并根据需要更改此行为。内置的[RequireHttp]属性没有相反的功能,但如果您愿意,可以轻松制作自己的属性。

还有Html.ActionLink()的重载采用协议参数;您可以明确指定“http”或“https”作为协议。这是一个这样的重载MSDN documentation。如果您没有指定协议或者如果您调用没有协议参数的重载,则假定您希望链接具有与当前请求相同的协议。

我们在MVC中没有[RequireHttp]属性的原因是它没有太大的好处。它不像[RequireHttps]那么有趣,它鼓励用户做错事。例如,许多网站通过SSL登录并在您登录后重定向回HTTP, 这绝对是错误的做法 。您的登录cookie与您的用户名+密码一样秘密,现在您通过网络以明文形式发送它。此外,在MVC管道运行之前,您已经花时间执行握手并保护通道(这是使HTTPS比HTTP慢的大部分),因此[RequireHttp]将不会发出当前请求或者未来的请求要快得多。

答案 1 :(得分:0)

您可以创建另一个自定义过滤器属性以移回http。从这个问题尝试解决方案...... Why once SSL is enabled with [RequireHttps] at action level, it remains enabled forever?