2011-05-10 56 views
1

我發現了一些我需要做的工作,但沒有能夠把所有東西放在一起轉化爲可行的解決方案。IIS 7.5 URL重寫 - 從http重定向到https帳戶控制器,但從https到其他所有內容

我工作的一個內部網站,並希望確保*只是登錄和註銷行爲我以https帳戶控制器上。我已經正確安裝了證書,並且可以使用UrlRewrite規則成功地將流量重定向到這些控制器的動作爲https:

<rule name="Redirect to HTTPS" stopProcessing="true"> 
    <match url="^account/logon$|^account/logoff$" /> 
     <conditions> 
      <add input="{HTTPS}" pattern="^OFF$" /> 
     </conditions> 
    <action type="Redirect" url="https://{HTTP_HOST}/{R:0}" redirectType="Permanent" /> 
</rule> 

然而,現在我也想重定向*整個網站的請求的其餘部分(其它比這兩個操作的流量)回到http。我沒有興趣討論這種方法的優點,因爲我有我認爲想要將https重定向回http的正當理由。

我已經嘗試在動作中編寫一些代碼來實現此目的,但是我遇到了一些重大問題。我不知道是否因爲我正在使用兩臺負載平衡的服務器或者什麼,但是我嘗試的任何操作都會給我一個「太多重定向」的錯誤消息。

於是,兩個問題:

  1. 是更好地使用UrlRewrite規則重定向了HTTPS或控制器行動?
  2. 有沒有人有一個工作代碼示例或至少可以讓我開始正確的道路?

任何幫助,非常感謝!

回答

0

首先,你將有一個小小的挑戰這裏只要非頁面資源 - 你是如何引用圖片和樣式?

至於眼下的問題,我想你想迫使網絡服務器,如負載平衡器的這個上行。我還會通過添加RequireHttps屬性來支持帳戶控制器。

最後,請記住,即使登錄過程被固定,如果該cookie不發送通過HTTPS,你可以很容易地與像場景中firesheep結束。

+0

是的,我們配置了負載平衡器,迫使一切HTTPS,但這種整合來自不支持https外部託管服務資源時提出的問題。管理我們數據中心的小組告訴我們,他們無法爲應用程序的不同部分選擇性地實施https。 – 2011-05-11 00:07:11

0

我有一些代碼here它可以讓你用屬性來控制它。

MVC已經有你將適用於您的登錄/註銷頁面的[RequireHttps]屬性。我的代碼擴展了這種方法,並給你一個額外的[ExitHttpsIfNotRequired]屬性。通過將此屬性應用於基本控制器,當您嘗試訪問任何不具有[RequireHttps]的HTTPS的操作時,它會將您重定向到HTTP。

+0

好吧,我剛剛實現了這一點,但我收到以下錯誤:「頁面沒有正確重定向」和「Firefox檢測到服務器以永不完整的方式重定向該地址的請求」時我嘗試點擊應該重定向回http的https頁面。 – 2011-05-11 00:04:00

+0

更多信息:我加入了FilterAttribute,並且URL字符串看起來是正確的(不是https)。 – 2011-05-11 00:11:09

+0

是否可以將其他內容重定向回HTTPS並導致重定向循環,如剩餘的URL重寫規則或負載均衡器? – 2011-05-11 00:35:11

1

比從未更好的遲到。這可能會幫助你或其他人。

<rule name="Redirect to HTTP"> 
     <match url="secureDir/(.*)" negate="true" /> 
     <conditions> 
      <add input="{HTTPS}" pattern="^ON$" /> 
     </conditions> 
     <action type="Redirect" url="http://{HTTP_HOST}{REQUEST_URI}" /> 
     </rule> 

     <rule name="Redirect to HTTPS" stopProcessing="true"> 
     <match url="secureDir/(.*)" /> 
     <conditions> 
      <add input="{HTTPS}" pattern="^OFF$" /> 
     </conditions> 
     <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" /> 
     </rule>