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

时间:2012-03-22 13:14:29

标签: 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重写”模块?

没有使用ASP.NET的经验所以如果这涉及到解决方案,请详细说明如何实施。

我使用web.config和而不是 PHP这样做的原因是我想在网站中的所有资产上强制使用HTTPS。

9 个答案:

答案 0 :(得分:382)

你需要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>

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

答案 1 :(得分:74)

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

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

您可能还需要执行其他操作来保护您的网站:

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

    AntiForgeryConfig.RequireSsl = true;
    
  2. 默认情况下,要求Cookie通过更改Web.config文件来要求HTTPS:

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

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. 使用NWebSec.Owin NuGet包并添加以下代码行以在整个站点中启用公钥锁定(HPKP)。更多信息herehere

    // 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));
    
  5. 在所使用的任何网址中加入https计划。当您在某些浏览器中模仿该方案时,Content Security Policy (CSP) HTTP标头和Subresource Integrity (SRI)不会很好用。最好明确HTTPS。 e.g。

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

答案 2 :(得分:11)

为了增加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>

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

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

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

服务器变量是

  • {HTTPS}OFFON
  • {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

答案 3 :(得分:4)

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

我缺少的一个关键点是我需要下载并安装IIS的URL重写工具。我发现它here结果如下。

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

答案 4 :(得分:1)

在.Net Core中,请按照https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

中的说明操作

在您的startup.cs中添加以下内容:

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

要将Http重定向到Https,请在startup.cs中添加以下内容

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

答案 5 :(得分:0)

优秀的NWebsec库可以使用upgrade-insecure-requests中的Web.config标记将您的请求从HTTP升级到HTTPS:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

答案 6 :(得分:0)

我不允许在我的环境中安装URL Rewrite,因此,我找到了另一条路径。

将此添加到我的web.config中添加了错误重写并在IIS 7.5上运行:

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

然后,按照这里的建议:https://www.sslshopper.com/iis7-redirect-http-to-https.html

我创建了执行重定向的html文件(redirectToHttps.html):

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

我希望有人觉得这很有用,因为我无法在其他任何地方找到所有作品。

答案 7 :(得分:0)

我正在使用以下代码,它非常适合我,希望对您有帮助。

<configuration>
<system.webServer>
    <rewrite>
        <rules>
            <rule name="Force redirect to https" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

答案 8 :(得分:-6)

简单方法是告诉IIS发送HTTP请求的自定义错误文件。然后,该文件可以包含元重定向,JavaScript重定向和带链接的说明等等。重要的是,您仍然可以检查&#34;要求SSL&#34;对于网站(或文件夹),这将有效。

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>