IIS 7.5 URL重写 - 从http重定向到https帐户控制器,但从https到其他所有内容

问题描述:

我发现了一些我需要做的工作,但没有能够把所有东西放在一起转化为可行的解决方案。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. 有没有人有一个工作代码示例或至少可以让我开始正确的道路?

任何帮助,非常感谢!

首先,你将有一个小小的挑战这里只要非页面资源 - 你是如何引用图片和样式?

至于眼下的问题,我想你想迫使网络服务器,如负载平衡器的这个上行。我还会通过添加RequireHttps属性来支持帐户控制器。

最后,请记住,即使登录过程被固定,如果该cookie不发送通过HTTPS,你可以很容易地与像场景中firesheep结束。

+0

是的,我们配置了负载平衡器,迫使一切HTTPS,但这种整合来自不支持https外部托管服务资源时提出的问题。管理我们数据中心的小组告诉我们,他们无法为应用程序的不同部分选择性地实施https。 – 2011-05-11 00:07:11

我有一些代码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

比从未更好的迟到。这可能会帮助你或其他人。

<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>