【问题标题】:IIS 7.5 URL Rewrite - Redirect from http to https for account controller but from https to http for everything elseIIS 7.5 URL 重写 - 帐户控制器从 http 重定向到 https,但其他所有内容从 https 重定向到 http
【发布时间】:2011-08-22 20:43:47
【问题描述】:

我已经找到了完成这项工作所需的一些零碎东西,但无法将所有内容整合到一个可行的解决方案中。

我在一个 Intranet 站点上工作,并且希望*仅使用 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 的正当理由。

我已经尝试在 Actions 中编写一些代码来实现这一点,但我遇到了重大问题。我不知道是不是因为我正在使用两台负载平衡的服务器或其他原因,但我尝试的任何操作都会给我一个“重定向太多”的错误消息。

那么,两个问题:

  1. 使用 UrlRewrite 规则从 https 或控制器操作重定向出更好吗?
  2. 有没有人有一个有效的代码示例或至少可以让我走上正确道路的东西?

非常感谢任何帮助!

【问题讨论】:

    标签: asp.net-mvc iis-7.5 url-rewriting


    【解决方案1】:

    首先,就非页面资源而言,您将面临一些挑战——您如何引用图像和样式表?

    至于手头的问题,我认为您想在 Web 服务器的上游强制执行此操作,例如在负载平衡器上。我还将通过添加 RequireHttps 属性来支持帐户控制器。

    最后,请记住,即使登录过程是安全的,如果该 cookie 不通过 HTTPS 传输,您很容易会遇到类似火羊的场景。

    【讨论】:

    • 是的,我们将负载均衡器配置为强制使用 https,但是在集成来自不支持 https 的外部托管服务的资源时会出现问题。管理我们数据中心的小组告诉我,他们不能有选择地为应用程序的不同部分强制实施 https。
    【解决方案2】:

    我有一些代码here 可以让你用属性控制它。

    MVC 已经有一个 [RequireHttps] 属性,您可以将其应用于登录/注销页面。我的代码扩展了这种方法,并为您提供了一个额外的 [ExitHttpsIfNotRequired] 属性。将此属性应用于您的基本控制器后,当您尝试使用 HTTPS 访问任何没有 [RequireHttps] 的操作时,它会将您重定向到 HTTP。

    【讨论】:

    • 好的,我刚刚实现了这个,但是我收到以下错误:“页面没有正确重定向”和“Firefox 检测到服务器正在重定向对该地址的请求当我尝试点击应该重定向回 http 的 https 页面时,这种方式永远不会完成。
    • 更多信息:我进入FilterAttribute,URL字符串似乎是正确的(不是https)。
    • 会不会是其他东西重定向回 HTTPS 并导致重定向循环,例如剩余的 URL 重写规则或您的负载均衡器?
    • 所以肯定不是服务器配置,因为我可以直接到每台服务器,并且重定向工作正常。这意味着它与负载均衡器有关。我们的数据中心工作人员发誓负载均衡器无法在单个页面上选择性地实现 https(全有或全无),因此这与负载均衡本身有关。当我弄清楚发生了什么时,我会在这里发帖。
    【解决方案3】:

    迟到总比没有好。这可能会对您或其他人有所帮助。

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

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2013-05-02
      • 2016-02-26
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2018-04-17
      • 2019-09-10
      相关资源
      最近更新 更多