วิธีที่ดีที่สุดใน asp.net เพื่อบังคับให้ https สำหรับทั้งไซต์


192

ประมาณ 6 เดือนที่ผ่านมาฉันเปิดตัวเว็บไซต์ที่ทุกคำขอต้องมีมากกว่า https วิธีเดียวที่ฉันสามารถค้นหาเพื่อให้แน่ใจว่าทุกคำขอไปยังหน้านั้นเกิน https คือการตรวจสอบในเหตุการณ์โหลดหน้า หากคำขอไม่เกิน http ฉันจะตอบกลับไปที่ direct.redirect (" https://example.com ")

มีวิธีที่ดีกว่า - ควรตั้งค่าบางอย่างใน web.config หรือไม่


ตรวจสอบคำตอบของฉันที่นี่stackoverflow.com/questions/33882350/…
Shady Sherif

คำตอบ:


250

โปรดใช้HSTS (HTTP Strict Transport Security)

จากhttp://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                        redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security"
                        pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

คำตอบเดิม (แทนที่ด้วยข้างต้นเมื่อวันที่ 4 ธันวาคม 2558)

เป็นพื้น

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false))
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
+   HttpContext.Current.Request.RawUrl);
   }
}

ที่จะไปใน global.asax.cs (หรือ global.asax.vb)

ฉันไม่รู้วิธีที่จะระบุใน web.config


7
ใช้งานได้ แต่มันอันตรายสำหรับฉัน: เมื่อฉันพยายามเรียกใช้ภายในเครื่องใน VS 2010 โดยใช้รหัสนี้หน้าเริ่มต้นของฉันจะไม่โหลด ฉันเพิ่งได้รับข้อความ "หน้าเว็บนี้ไม่พร้อมใช้งาน" แทน ในการแก้ไขปัญหาฉันได้เพิ่มเงื่อนไขที่สองเพื่อทดสอบว่า URL มีสตริง "localhost" หรือไม่: หากไม่มีให้บังคับ https
mg1075

3
นี่คือการเปลี่ยนเส้นทางให้ฉัน ก่อนที่ฉันจะเพิ่มรหัสมันใช้งานได้ดี ข้อเสนอแนะใด ๆ
Joe

9
โปรดทราบว่านี่ไม่ได้ให้การรักษาความปลอดภัยที่เป็นประโยชน์ใด ๆ ที่จริงแล้วมันจะรักษาความปลอดภัยการเชื่อมต่อจากผู้ใช้ที่ปลอดภัยอยู่แล้วและจะไม่ปลอดภัยต่อการถูกโจมตี (เพราะ MITM สามารถละเว้นการเปลี่ยนเส้นทางทั้งหมดและส่งต่อทุกสิ่งไปยังไซต์ "ปลอดภัย" ของคุณ) IMHO การเปลี่ยนเส้นทางตัวแทนผู้ใช้เป็นการรักษาความปลอดภัยของวูดูที่ดีและให้ภาพลวงตาที่เป็นอันตรายในบางครั้งความปลอดภัย วิธีเดียวที่จะไปคือสั่งให้ตัวแทนผู้ใช้ร้องขอทรัพยากรที่ปลอดภัยเท่านั้นไม่ใช่เปลี่ยนเส้นทางหากไม่ได้ นี่คือสิ่งที่ HSTS ทำ - ดูคำตอบด้านล่าง
TNE

2
คำตอบนี้ควรถูกพิจารณาว่า 'เป็นอันตราย' และไม่ควรใช้ ตามความคิดเห็นโดย @tne ด้านบน
Rosdi Kasim

2
@RosdiKasim คำตอบนี้ควรได้รับการพิจารณาว่าเป็นอันตรายตั้งแต่การแก้ไข 4 ธันวาคม '15?
Andrew Morton

123

สิ่งอื่นที่คุณสามารถทำได้คือใช้HSTSโดยส่งกลับหัวข้อ "Strict-Transport-Security" ไปยังเบราว์เซอร์ เบราว์เซอร์จะต้องรองรับสิ่งนี้ (และในปัจจุบันคือ Chrome และ Firefox เป็นหลัก) แต่หมายความว่าเมื่อตั้งค่าแล้วเบราว์เซอร์จะไม่ส่งคำขอไปยังไซต์ผ่าน HTTP และจะแปลพวกเขาเป็นคำขอ HTTPS แทนก่อนที่จะออก . ลองใช้วิธีนี้ร่วมกับการเปลี่ยนเส้นทางจาก HTTP:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  switch (Request.Url.Scheme)
  {
    case "https":
      Response.AddHeader("Strict-Transport-Security", "max-age=300");
      break;
    case "http":
      var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", path);
      break;
  }
}

เบราว์เซอร์ที่ไม่ทราบ HSTS จะเพิกเฉยต่อส่วนหัว แต่จะยังคงถูกดักจับโดยคำสั่ง switch และส่งไปยัง HTTPS


6
ไม่เคยได้ยินเรื่องส่วนหัว HSTS มาก่อน แต่ดูเท่มาก มีเหตุผลใดบ้างสำหรับการใช้ค่า max-age ขนาดเล็กเช่นนี้ (5 นาที)? บทความ Wikipedia ที่คุณเชื่อมโยงเพื่อแนะนำให้ตั้งค่าเป็นค่ามาก (6-12 เดือน)
dana

5
+1 ลองดูบทความที่มีเนื้อหาครอบคลุมบนบล็อกของ Troy ซึ่งมีรายละเอียดว่าทำไมการใช้การเปลี่ยนเส้นทางเพียงอย่างเดียวจึงสามารถลดความปลอดภัยได้ คำแนะนำ: อาจทำให้คุณเสี่ยงต่อเครื่องมือ SSL Strip เหนือสิ่งอื่นใด troyhunt.com/2011/11/…
Oran Dennison

3
ยังคุ้มค่าที่จะตรวจสอบNWebsecซึ่งทำให้สิ่งนี้ (และอื่น ๆ ) นั้นง่ายมาก
Tieson T.

16
คุณจะต้องปิดสวิตช์if(!Request.IsLocal)เพื่อไม่ให้ดีบั๊ก
Justin J Stark

1
คำตอบที่ดี. หนึ่งความละเอียดอ่อน - สำหรับส่วนหัว Http ("Strict-Transport-Security") จะเป็นการดีกว่าถ้าใช้ไลบรารี่อย่าง NWebSec เพราะมีหลายตัวเลือกที่กระจุกตัวอยู่ในที่เดียว
Ognyan Dimitrov

89

โมดูล IIS7 จะให้คุณเปลี่ยนเส้นทาง

    <rewrite>
        <rules>
            <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
                <match url="(.*)"/>
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$"/>
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
            </rule>
        </rules>
    </rewrite>

12
นอกจากนี้สำหรับ IIS 7.0 คุณต้องติดตั้ง Url Rewrite Module 2.0
Chris

ฉันพบว่าลิงก์นี้เรียบง่ายและมีประโยชน์ในการทำให้หน้าใด ๆ ยอมรับเฉพาะคำขอ https - support.microsoft.com/kb/239875
Manik Arora

21

สำหรับผู้ที่ใช้ ASP.NET MVC คุณสามารถใช้สิ่งต่อไปนี้เพื่อบังคับ SSL / TLS ผ่าน HTTPS ทั่วทั้งไซต์ได้สองวิธี:

วิธีที่ยาก

1 - เพิ่ม RequireHttpsAttribute ไปยังตัวกรองส่วนกลาง:

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

2 - บังคับโทเค็นการป้องกันการปลอมแปลงให้ใช้ SSL / TLS:

AntiForgeryConfig.RequireSsl = true;

3 - ต้องการให้คุกกี้ต้องใช้ HTTPS เป็นค่าเริ่มต้นโดยการเปลี่ยนไฟล์ Web.config:

<system.web>
    <httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>

4 - ใช้แพ็คเกจ NWebSec.Owin NuGet และเพิ่มบรรทัดของรหัสต่อไปนี้เพื่อเปิดใช้งาน Strict Transport Security ทั่วทั้งไซต์ อย่าลืมที่จะเพิ่มคำสั่ง Preload ด้านล่างและส่งเว็บไซต์ของคุณไปยังเว็บไซต์ HSTS Preload ข้อมูลเพิ่มเติมที่นี่และที่นี่ โปรดทราบว่าหากคุณไม่ได้ใช้ OWIN จะมีวิธี Web.config ที่คุณสามารถอ่านบนเว็บไซต์NWebSec

// app is your OWIN IAppBuilder app in Startup.cs
app.UseHsts(options => options.MaxAge(days: 30).Preload());

5 - ใช้แพ็คเกจ 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));

6 - รวมรูปแบบ https ใน URL ใด ๆ ที่ใช้ ส่วนหัว HTTP นโยบายความปลอดภัยเนื้อหา (CSP)และSubresource Integrity (SRI)เล่นได้ไม่ดีเมื่อคุณเลียนแบบโครงร่างในเบราว์เซอร์บางตัว เป็นการดีกว่าที่จะมีความชัดเจนเกี่ยวกับ HTTPS เช่น

<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script>

วิธีที่ง่าย

ใช้เทมเพลตโครงการASP.NET MVC Boilerplate Visual Studio เพื่อสร้างโครงการที่มีทั้งหมดนี้และมีอยู่แล้วภายในอีกมากมายคุณยังสามารถดูรหัสบนGitHubได้


3
นอกจากนี้หากใช้<authentication mode="Forms">ภายในคุณต้องมี<forms requireSSL="true">
พลูโต

1
@ muhammad-rehan-saeed ฉันใช้ mvc5 boilerplate แต่เว็บไซต์ไม่เปลี่ยนเส้นทาง http ไปที่ https โดยอัตโนมัติบนเซิร์ฟเวอร์ที่ใช้งานจริงมันทำเช่นนั้นบน localhost เท่านั้นมีบางอย่างที่ฉันขาดหายไปหรือไม่
Diin

นี่ไม่ใช่ฟอรัมที่เหมาะสมที่จะถามคำถามนี้ โพสต์ปัญหาบนเว็บไซต์ GitHub RequireHttpsAttributeไม่เปลี่ยนเส้นทาง ตราบใดที่คุณมีว่ามันควรจะดี
มูฮัมหมัดเรฮันซาอีด

@ MuhammadRehanSaeed รักคำตอบของคุณ แต่ ... ฉันจะรับแฮช SHA256 ของใบรับรองที่สร้างด้วย MakeCert ได้อย่างไร สิ่งที่ฉันมีคือลายนิ้วมือ SHA-1 ... คุณรู้หรือไม่?
ไดอาน่า

1
@ ไดอาน่าลิงค์นี้สามารถแสดงให้คุณเห็นว่า
มูฮัมหมัดเรฮันซาอีด

13

หากคุณไม่สามารถตั้งค่านี้ใน IIS ด้วยเหตุผลใดก็ตามฉันจะสร้างโมดูล HTTP ที่จะเปลี่ยนเส้นทางให้คุณ:

using System;
using System.Web;

namespace HttpsOnly
{
    /// <summary>
    /// Redirects the Request to HTTPS if it comes in on an insecure channel.
    /// </summary>
    public class HttpsOnlyModule : IHttpModule
    {
        public void Init(HttpApplication app)
        {
            // Note we cannot trust IsSecureConnection when 
            // in a webfarm, because usually only the load balancer 
            // will come in on a secure port the request will be then 
            // internally redirected to local machine on a specified port.

            // Move this to a config file, if your behind a farm, 
            // set this to the local port used internally.
            int specialPort = 443;

            if (!app.Context.Request.IsSecureConnection 
               || app.Context.Request.Url.Port != specialPort)
            {
               app.Context.Response.Redirect("https://" 
                  + app.Context.Request.ServerVariables["HTTP_HOST"] 
                  + app.Context.Request.RawUrl);    
            }
        }

        public void Dispose()
        {
            // Needed for IHttpModule
        }
    }
}

จากนั้นเพียงคอมไพล์มันลงใน DLL, เพิ่มมันเป็นการอ้างอิงถึงโครงการของคุณและวางมันลงใน web.config:

 <httpModules>
      <add name="HttpsOnlyModule" type="HttpsOnly.HttpsOnlyModule, HttpsOnly" />
 </httpModules>

ดูเหมือนว่าสิ่งนี้จะเกี่ยวข้องมากกว่าเพียงแค่ติดอยู่ในโลกโลกาภิวัตน์ - แค่อยากรู้อยากเห็นมีข้อได้เปรียบหรือไม่?
ไบรอันแมคเคย์

1
ข้อดีคือเมื่อคุณไม่ต้องการใช้มันเพียงแค่แสดงความคิดเห็นโมดูลในเว็บของคุณกำหนดค่า โซลูชันนี้สามารถกำหนดค่าได้ในขณะที่ผลิตภัณฑ์อื่นไม่ได้
Bob Yexley

2
ฉันสับสนเล็กน้อย ฉันคาดหวังบางอย่างเช่นapp.BeginRequest += new OnBeginRequest;ในInitวิธีการและในOnBeginRequestจะมีสิ่งที่Initวิธีการในปัจจุบันมี คุณแน่ใจหรือว่าโมดูลนี้ใช้งานได้ตามที่คาดไว้?
จาคุบŠturc

มันไม่ทำงาน. คุณจำเป็นต้องเพิ่มเหตุการณ์ OnBeginRequest ฯลฯ จากนั้นก็ใช้งานได้
SnAzBaZ

ฉันจะแก้ไขโค้ดที่ผิดพลาด แต่เพื่อให้ปลอดภัยคุณต้องใช้ HSTS ด้วย เพียงไปกับคำตอบของ Troy Hunt และทำให้เป็นโมดูล ดูที่support.microsoft.com/en-us/kb/307996 (ผู้สูงอายุ แต่เป็นคนดี)
Marc L.

4

สิ่งที่คุณต้องทำคือ:

1) เพิ่มรหัสใน web.config ขึ้นอยู่กับเซิร์ฟเวอร์ที่ใช้งานจริงหรือขั้นตอนด้านล่าง

<add key="HttpsServer" value="stage"/>
             or
<add key="HttpsServer" value="prod"/>

2) ภายในไฟล์ Global.asax ของคุณเพิ่มวิธีการด้านล่าง

void Application_BeginRequest(Object sender, EventArgs e)
{
    //if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "prod")
    if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "stage")
    {
        if (!HttpContext.Current.Request.IsSecureConnection)
        {
            if (!Request.Url.GetLeftPart(UriPartial.Authority).Contains("www"))
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://www."), true);
            }
            else
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://"), true);
            }
        }
    }
}

3

หากการสนับสนุน SSL ไม่สามารถกำหนดค่าได้ในเว็บไซต์ของคุณ (เช่น. ควรจะสามารถเปิด / ปิด https) - คุณสามารถใช้แอตทริบิวต์ [RequireHttps] ในการกระทำของคอนโทรลเลอร์ / คอนโทรลเลอร์ที่คุณต้องการรักษาความปลอดภัย


2

นอกจากนี้ยังขึ้นอยู่กับแบรนด์ของบาลานเซอร์ของคุณสำหรับเว็บ mux คุณจะต้องมองหาส่วนหัว http X-WebMux-SSL-termination: trueเพื่อระบุว่าปริมาณการใช้งานที่เข้ามาคือ ssl รายละเอียดได้ที่นี่: http://www.cainetworks.com/support/redirect2ssl.html


2

สำหรับ @Joe ด้านบน "นี่เป็นการวนลูปการเปลี่ยนเส้นทางให้ฉันก่อนที่ฉันจะเพิ่มโค้ดมันใช้งานได้ดีคำแนะนำใด ๆ ? - Joe Nov 8 '11 at 4:13"

สิ่งนี้เกิดขึ้นกับฉันเช่นกันและสิ่งที่ฉันเชื่อว่าเกิดขึ้นคือมี load balancer ที่ยกเลิกการร้องขอ SSL หน้าเว็บเซิร์ฟเวอร์ ดังนั้นเว็บไซต์ของฉันมักจะคิดว่าคำขอคือ "http" แม้ว่าเบราว์เซอร์ดั้งเดิมจะขอให้เป็น "https"

ฉันยอมรับว่านี่เป็นบิตแฮ็ก แต่สิ่งที่ใช้ได้ผลสำหรับฉันคือการใช้คุณสมบัติ "JustRedirected" ที่ฉันสามารถใช้เพื่อหาว่าบุคคลนั้นถูกเปลี่ยนเส้นทางแล้วครั้งเดียว ดังนั้นฉันจะทดสอบเงื่อนไขเฉพาะที่รับประกันการเปลี่ยนเส้นทางและหากตรงตามเงื่อนไขฉันจะตั้งค่าคุณสมบัตินี้ (ค่าที่เก็บไว้ในเซสชัน) ก่อนการเปลี่ยนเส้นทาง แม้ว่าเงื่อนไข http / https สำหรับการเปลี่ยนเส้นทางจะเป็นไปตามครั้งที่สอง แต่ฉันข้ามตรรกะการเปลี่ยนเส้นทางและรีเซ็ตค่าเซสชัน "JustRedirected" เป็นเท็จ คุณจะต้องใช้ตรรกะการทดสอบตามเงื่อนไขของคุณเอง แต่นี่คือการใช้งานคุณสมบัติอย่างง่าย:

    public bool JustRedirected
    {
        get
        {
            if (Session[RosadaConst.JUSTREDIRECTED] == null)
                return false;

            return (bool)Session[RosadaConst.JUSTREDIRECTED];
        }
        set
        {
            Session[RosadaConst.JUSTREDIRECTED] = value;
        }
    }

2

ฉันจะโยนสองเซ็นต์ของฉันถ้าคุณมีการเข้าถึงด้านเซิร์ฟเวอร์ IIS จากนั้นคุณสามารถบังคับ HTTPS โดยใช้การผูกโปรโตคอล ตัวอย่างเช่นคุณมีเว็บไซต์ที่เรียกว่าBlah ใน IIS คุณควรที่จะติดตั้งทั้งสองเว็บไซต์: BlahและBlah (เปลี่ยนเส้นทาง) สำหรับBlahเพียงกำหนดค่าการHTTPSเชื่อมโยง (และFTPถ้าคุณต้องการตรวจสอบให้แน่ใจว่าได้บังคับผ่านการเชื่อมต่อที่ปลอดภัยเช่นกัน) สำหรับBlah (เปลี่ยนเส้นทาง)กำหนดค่าการHTTPเชื่อมเท่านั้น สุดท้ายในส่วนHTTP RedirectสำหรับBlah (Redirect)ตรวจสอบให้แน่ใจว่าตั้งค่า 301 redirect ไปยังhttps://blah.comโดยเปิดใช้งานปลายทางที่แน่นอน ตรวจสอบให้แน่ใจว่าแต่ละไซต์ใน IIS ชี้ไปที่ไซต์นั้นโฟลเดอร์รากของตัวเองมิฉะนั้น Web.configจะทำให้เมาทั้งหมด นอกจากนี้ตรวจสอบให้แน่ใจว่าได้HSTSกำหนดค่าบนไซต์ HTTPSed ของคุณเพื่อให้การร้องขอในภายหลังโดยเบราว์เซอร์ถูกบังคับให้ HTTPS เสมอและไม่มีการเปลี่ยนเส้นทางเกิดขึ้น


2

นี่เป็นคำตอบที่สมบูรณ์ขึ้นอยู่กับ @Troy Hunt เพิ่มฟังก์ชั่นนี้ให้กับWebApplicationชั้นเรียนของคุณในGlobal.asax.cs:

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        // Allow https pages in debugging
        if (Request.IsLocal)
        {
            if (Request.Url.Scheme == "http")
            {
                int localSslPort = 44362; // Your local IIS port for HTTPS

                var path = "https://" + Request.Url.Host + ":" + localSslPort + Request.Url.PathAndQuery;

                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", path);
            }
        }
        else
        {
            switch (Request.Url.Scheme)
            {
                case "https":
                    Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
                    break;
                case "http":
                    var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
                    Response.Status = "301 Moved Permanently";
                    Response.AddHeader("Location", path);
                    break;
            }
        }
    }

(ในการเปิดใช้งาน SSL บนบิลด์ในเครื่องของคุณให้เปิดใช้งานใน Properties Dock สำหรับโครงการ)


1

-> เพียงแค่เพิ่ม [RequireHttps] ด้านบนของ HomeController คลาสสาธารณะ: Controller

-> และเพิ่ม GlobalFilters.Filters.Add (ใหม่ RequireHttpsAttribute ()); ในวิธีการป้องกันโมฆะ Application_Start () ในไฟล์ Global.asax.cs

ซึ่งบังคับให้แอปพลิเคชันทั้งหมดของคุณไปยัง HTTPS


ฉันไม่เชื่อว่าสิ่งนี้จะใช้ได้กับหน้าเว็บใดก็ตามที่ให้บริการโดยใช้ WebForms หรือ API ใด ๆ ที่สร้างด้วย WebAPI มันจะครอบคลุมตัวควบคุม MVC เท่านั้น
Marc L.

1

ฉันใช้เวลาบางครั้งมองหาวิธีปฏิบัติที่ดีที่สุดที่ทำให้รู้สึกและพบต่อไปนี้ซึ่งทำงานได้สมบูรณ์แบบสำหรับฉัน ฉันหวังว่าสิ่งนี้จะช่วยคุณได้ในบางครั้ง

การใช้ไฟล์กำหนดค่า (เช่นเว็บไซต์ asp.net) https://blogs.msdn.microsoft.com/kaushal/2013/05/22/http-to-https-redirects-on-iis-7-x-and- / สูง

หรือบนเซิร์ฟเวอร์ของคุณเอง https://www.sslshopper.com/iis7-redirect-http-to-https.html

[คำตอบสั้น ๆ ] เพียงแค่โค้ดด้านล่างเข้าไปข้างใน

<system.webServer> 
 <rewrite>
     <rules>
       <rule name="HTTP/S to HTTPS Redirect" enabled="true" 
           stopProcessing="true">
       <match url="(.*)" />
        <conditions logicalGrouping="MatchAny">
        <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
       </conditions>
       <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
        redirectType="Permanent" />
        </rule>
       </rules>
 </rewrite>

1

ใน IIS10 (Windows 10 และเซิร์ฟเวอร์ 2016) จากรุ่น 1709 เป็นต้นไปมีตัวเลือกใหม่ที่ง่ายกว่าสำหรับการเปิดใช้งาน HSTS สำหรับเว็บไซต์

Microsoft อธิบายข้อดีของวิธีการใหม่ที่นี่และให้ตัวอย่างที่แตกต่างมากมายของวิธีการใช้การเปลี่ยนแปลงโดยทางโปรแกรมหรือโดยการแก้ไขไฟล์ ApplicationHost.config โดยตรง (ซึ่งคล้ายกับ web.config แต่ทำงานในระดับ IIS มากกว่าระดับไซต์แต่ละรายการ ) ApplicationHost.config สามารถพบได้ใน C: \ Windows \ System32 \ inetsrv \ config

ฉันได้อธิบายวิธีการสองตัวอย่างที่นี่เพื่อหลีกเลี่ยงการเน่าลิงค์

วิธีที่ 1 - แก้ไขไฟล์ ApplicationHost.config โดยตรงระหว่าง<site>แท็กเพิ่มบรรทัดนี้:

<hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />

วิธีที่ 2 - บรรทัดคำสั่ง: ดำเนินการต่อไปนี้จากพรอมต์คำสั่งยกระดับ (เช่นเมาส์ขวาบน CMD และเรียกใช้ในฐานะผู้ดูแลระบบ) อย่าลืมเปลี่ยน Contoso ด้วยชื่อไซต์ของคุณตามที่ปรากฏใน IIS Manager

c:
cd C:\WINDOWS\system32\inetsrv\
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.enabled:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.max-age:31536000" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.includeSubDomains:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.redirectHttpToHttps:True" /commit:apphost

วิธีการอื่นที่ Microsoft เสนอในบทความนั้นอาจเป็นตัวเลือกที่ดีกว่าถ้าคุณอยู่ในสภาพแวดล้อมที่โฮสต์ซึ่งคุณมีการ จำกัด การเข้าถึง

โปรดทราบว่า IIS10 รุ่น 1709 พร้อมใช้งานบน Windows 10 แล้ว แต่สำหรับ Windows Server 2016 นั้นอยู่ในแทร็คการเปิดตัวที่แตกต่างกันและจะไม่ถูกนำออกใช้เป็นแพตช์หรือเซอร์วิสแพ็ค ดูที่นี่สำหรับรายละเอียดเกี่ยวกับ 1709


0

หากคุณใช้ ASP.NET Core คุณสามารถลองใช้แพคเกจ nuget SaidOut.AspNetCore.HttpsWithStrictTransportSecurity

จากนั้นคุณจะต้องเพิ่ม

app.UseHttpsWithHsts(HttpsMode.AllowedRedirectForGet, configureRoutes: routeAction);

สิ่งนี้จะเพิ่มส่วนหัว HTTP StrictTransportSecurity ให้กับคำขอทั้งหมดที่ทำโดยใช้รูปแบบ https

ตัวอย่างรหัสและเอกสารประกอบhttps://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.