如何使用web.config文件强制HTTPS

Ben*_*rey 208 c# asp.net iis https web-config

我搜索了Google和StackOverflow试图找到解决方案,但它们似乎都与ASP.NET等有关.

我通常在我的服务器上运行Linux,但是对于这个客户端,我使用Windows与IIS 7.5(和Plesk 10).这就是为什么我对IIS和web.config文件略有不熟悉的原因.在.htaccess文件中,您可以使用重写条件来检测协议是否为HTTPS并相应地重定向.有没有一种简单的方法可以使用web.config文件实现这一点,甚至使用我安装的" URL Rewrite "模块?

没有使用ASP.NET的经验,所以如果这涉及到解决方案,那么请包括如何实现的明确步骤.

我使用web.config而不是 PHP 执行此操作的原因是我想在站点内的所有资产上强制使用HTTPS.

Laz*_*One 405

你需要URL Rewrite模块,最好是v2(我没有安装v1,所以不能保证它会在那里工作,但它应该).

以下是此类web.config的示例 - 它将强制所有资源使用HTTPS(使用301永久重定向):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

PS 这个特殊的解决方案与ASP.NET/PHP或任何其他技术无关,因为它仅使用URL重写模块完成 - 它在初始/更低级别之一处理 - 在请求到达您的代码之前被执行.

  • 我建议更改重定向,使其不附加查询字符串,因为它已经是{REQUEST_URI}的一部分(否则参数会被添加两次).`<action type ="Redirect"url ="https:// {HTTP_HOST} {REQUEST_URI}"redirectType ="Permanent"appendQueryString ="false"/>` (19认同)
  • @BenCarey您还应该查看`Strict-Transport-Security`标题:http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security (6认同)
  • 这可以工作,但是不幸的是在本地主机上也可以。为了避免这种情况,您可以将其添加到&lt;conditions&gt;:&lt;add input =“ {HTTP_HOST}” pattern =“ localhost” negate =“ true” /&gt; (4认同)
  • 使用AWS Elastic beanstalk,这个方法给了我一个302太多的重定向,直到我修改:`<match url =".*"/>`到`<match url ="http://*.*"/>` (4认同)

Muh*_*eed 75

对于那些使用ASP.NET MVC的人.您可以使用RequireHttpsAttribute强制所有响应为HTTPS:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());
Run Code Online (Sandbox Code Playgroud)

您可能还需要做的其他事情来保护您的网站:

  1. 强制使用Anti-Forgery令牌来使用SSL/TLS:

    AntiForgeryConfig.RequireSsl = true;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过更改Web.config文件,默认情况下要求Cookie要求HTTPS:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用NWebSec.Owin NuGet包并添加以下代码行以在站点中启用严格传输安全性(HSTS).不要忘记在下面添加Preload指令并将您的站点提交到HSTS Preload站点.更多信息在这里这里.请注意,如果您不使用OWIN,则可以在NWebSec站点上读取Web.config方法.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用NWebSec.Owin NuGet包并添加以下代码行以在站点上启用公钥锁定(HPKP).更多信息在这里这里.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在任何使用的URL中包含https方案.内容安全策略(CSP) HTTP标头和子资源完整性(SRI)在某些浏览器中模仿该方案时效果不佳.最好明确HTTPS.例如

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
    Run Code Online (Sandbox Code Playgroud)
  6. 使用ASP.NET MVC Boilerplate Visual Studio项目模板生成一个包含所有这些内置项目的项目.您还可以在GitHub上查看代码.

  • 在我看来,这是一个非常有价值的答案.当有人搜索主题并针对这个问题时,我很高兴你的答案就在这里. (11认同)
  • a)解决方案有效但事情已经发生变化,这个突出的,高评价的问题值得使用MVC内置的更新答案.b)答案试图涵盖所有基础.问题并不简单,在整个站点上启用HTTPS需要的不仅仅是更改web.config文件.读者可能会误以为只需更改Web.config文件即可.安全性很难,因为没有不完整/过时的答案. (6认同)
  • 这个问题要求ASP.NET,但没有说明WebForms或MVC,所以我给那些使用MVC(不使用Web.config文件强制HTTPS)但仍然...... downvoted的人提供了一个全面的答案. (4认同)

Sha*_*tin 12

为了增加LazyOne的答案,这里是答案的注释版本.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action 
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

清除可能已在此服务器上定义的所有其他规则.创建一个新规则,我们将其命名为"将所有请求重定向到https".处理完此规则后,请不要再处理任何规则!匹配所有传入的URL.然后检查所有这些其他条件是否都为真:HTTPS已关闭.嗯,这只是一个条件(但要确保它是真的).如果是,请将301永久重定向发送回客户端http://www.foobar.com/whatever?else=the#url-contains.不要在结尾处添加查询字符串,因为它会复制查询字符串!

这就是属性,属性和一些值的含义.

  • clear删除我们可能继承的所有服务器规则.
  • 规则定义规则.
    • 为规则命名一个任意(但唯一)的名称.
    • stopProcessing是否立即将请求转发到IIS请求管道或首先处理其他规则.
  • 匹配何时运行此规则.
    • url用于评估URL的模式
  • 条件关于何时运行此规则的附加条件; 只有在第一次匹配时才处理条件.
    • logicalGrouping是否所有条件必须为true(MatchAll)或任何条件必须为true(MatchAny); 类似于AND vs OR.
  • 添加添加必须满足的条件.
    • 输入条件评估的输入; 输入可以是服务器变量.
    • 模式评估输入的标准.
    • ignoreCase资本化是否重要.
  • 行动该怎么做如果它match和它conditions都是真的.
    • type通常可以是redirect(客户端)或rewrite(服务器端).
    • url由于这个规则会产生什么; 在这种情况下,https://与两个服务器变量连接.
    • redirectType HTTP重定向使用的内容; 这个是永久性的301.
    • appendQueryString是否在结果的末尾添加查询字符串url; 在这种情况下,我们将其设置为false,因为{REQUEST_URI}已经包含它.

服务器变量是

  • {HTTPS}这是OFF或者ON.
  • {HTTP_HOST}www.mysite.com,和
  • {REQUEST_URI} 包括URI的其余部分,例如 /home?key=value
    • 浏览器处理#fragment(参见LazyOne的评论).

另见:https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


Eri*_*ric 6

接受的答案对我不起作用。我按照此博客上的步骤进行操作。

我缺少的一个关键点是我需要下载并安装IIS的URL重写工具。我在这里找到的。结果如下。

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>
Run Code Online (Sandbox Code Playgroud)