2012-03-15 30 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