2012-03-15 61 views
7

我有一个ASP MVC 3网站,它有一个反馈表单,并且应该要求SSL。ASP MVC 3 RequireHttps属性更改所有链接到https

现在,我有一个叫做所谓的“联系我们”控制器,负责查看和处理反馈反馈里面的动作。

当我用该动作的[RequireHttps]属性,它的作品不错,它改变了URL为“https”。但是,我注意到我的页面中的所有链接现在都指向“https”!就好像这个属性已经强制路由引擎应用到所有链接一样!

当然,SSL只需要这个单一动作,其余的都需要有正常的http。

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

+0

为什么您的其他网页“仅需要”http?是否真的很重要,只要需要https的页面被加密? – 2012-03-16 00:29:17

+0

@Mystere Man:https严重降低了Web服务器的性能。在某些配置上它可能是一个大问题。 – 2012-07-03 02:45:59

+1

@zespri - 在过去的日子里,https是一个重要的负载。今天,我向你保证,服务器在构建页面上做的工作要比对它进行加密更多。你说你宁愿让你的网站不安全,也不愿意处理轻微的负载增加。下面的Ricks指出,您已经通过https登录创建了负载,未来的请求不需要额外的处理。 – 2012-07-03 04:48:32

回答

13

在你的情况[RequireHttp]如果你明确了登录cookie属性可能是OK - 或者你会在通过纯文本发送。这可能比避免进一步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]不会使当前请求或未来请求变得很多更快。

+0

感谢您的回复。我想我应该使用LinkExtensions.ActionLink,但我不知道如何正确使用它。你能向我解释一下吗? – Yousi 2012-04-08 10:34:36

+0

可能是一个基本问题,请阅读[这里](http://security.stackexchange.com/questions/12531/ssl-with-get-and-post)和[here](http://stackoverflow.com/问题/ 499591/are-https-urls-encrypted)'post'请求也被加密, 但是想知道天气我应该在post中装饰'RequireHttps'吗? – stom 2016-02-22 16:24:53

0

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

+1

您的登录cookie与您的用户名+密码一样秘密,现在您可以通过电报以明文形式发送它。此外,在MVC管道运行之前,您已经花时间执行握手并确保通道(这是HTTPS比HTTP更慢的原因),因此[RequireHttp]不会提出当前请求或未来请求要快得多。 – RickAndMSFT 2012-03-16 00:55:17