ASP.NET MVC RequireHttps ในการผลิตเท่านั้น


121

ฉันต้องการใช้RequireHttpsAttributeเพื่อป้องกันไม่ให้ส่งคำขอ HTTP ที่ไม่ปลอดภัยไปยังวิธีการดำเนินการ

ค#

[RequireHttps] //apply to all actions in controller
public class SomeController 
{
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
        ...
    }
}

VB

<RequireHttps()> _
Public Class SomeController

    <RequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

ขออภัยเซิร์ฟเวอร์การพัฒนา ASP.NET ไม่รองรับ HTTPS

ฉันจะทำให้แอปพลิเคชัน ASP.NET MVC ของฉันใช้ RequireHttps ได้อย่างไรเมื่อเผยแพร่ไปยังสภาพแวดล้อมการใช้งานจริง แต่ไม่สามารถทำงานบนเวิร์กสเตชันการพัฒนาของฉันบนเซิร์ฟเวอร์การพัฒนา ASP.NET ได้อย่างไร


3
ทดสอบกับ IIS ในพื้นที่ของคุณและด้วย IIS Express ดูบล็อก SSL ของฉันblogs.msdn.com/b/rickandy/archive/2011/04/22/… และ blogs.msdn.com/b/rickandy/archive/2012/03/23/…
RickAndMSFT

คำตอบ:


129

สิ่งนี้จะไม่ช่วยอะไรหากคุณเรียกใช้ Release builds บนเวิร์กสเตชันการพัฒนาของคุณ แต่การคอมไพล์ตามเงื่อนไขสามารถทำงานได้ ...

#if !DEBUG
[RequireHttps] //apply to all actions in controller
#endif
public class SomeController 
{
    //... or ...
#if !DEBUG
    [RequireHttps] //apply to this action only
#endif
    public ActionResult SomeAction()
    {
    }

}

ปรับปรุง

ใน Visual Basic แอตทริบิวต์เป็นส่วนหนึ่งทางเทคนิคของบรรทัดเดียวกับคำจำกัดความที่ใช้กับ คุณไม่สามารถใส่คำสั่งการคอมไพล์ตามเงื่อนไขภายในบรรทัดได้ดังนั้นคุณจะต้องเขียนการประกาศฟังก์ชันสองครั้ง - หนึ่งครั้งโดยใช้แอตทริบิวต์และอีกครั้งโดยไม่ต้อง แม้ว่าจะได้ผลถ้าคุณไม่คำนึงถึงความอัปลักษณ์

#If Not Debug Then
    <RequireHttps()> _
    Function SomeAction() As ActionResult
#Else
    Function SomeAction() As ActionResult
#End If
        ...
    End Function

อัปเดต 2

มีหลายคนกล่าวถึงRequireHttpsAttributeโดยไม่ได้ให้ตัวอย่างดังนั้นนี่คือสิ่งที่เหมาะสำหรับคุณ ฉันคิดว่าวิธีนี้น่าจะสะอาดกว่าวิธีการรวบรวมแบบมีเงื่อนไขมากและมันจะเป็นความชอบของฉันในตำแหน่งของคุณ

การปฏิเสธความรับผิด: ฉันไม่ได้ทดสอบโค้ดนี้แม้แต่นิดเดียวและ VB ของฉันค่อนข้างเป็นสนิม ทั้งหมดที่ฉันรู้ก็คือมันรวบรวม ฉันเขียนตามคำแนะนำของ spot, queen3 และ Lance Fisher หากไม่ได้ผลอย่างน้อยก็ควรสื่อถึงแนวคิดทั่วไปและให้จุดเริ่มต้นแก่คุณ

Public Class RemoteRequireHttpsAttribute
    Inherits System.Web.Mvc.RequireHttpsAttribute

    Public Overrides Sub OnAuthorization(ByVal filterContext As  _
                                         System.Web.Mvc.AuthorizationContext)
        If IsNothing(filterContext) Then
            Throw New ArgumentNullException("filterContext")
        End If

        If Not IsNothing(filterContext.HttpContext) AndAlso _
            filterContext.HttpContext.Request.IsLocal Then
            Return
        End If

        MyBase.OnAuthorization(filterContext)
    End Sub

End Class

โดยทั่วไปแล้วแอตทริบิวต์ใหม่จะหยุดทำงานแทนที่จะเรียกใช้รหัสการอนุญาต SSL เริ่มต้นหากคำขอปัจจุบันเป็นแบบโลคัล (นั่นคือคุณกำลังเข้าถึงไซต์ผ่าน localhost) คุณสามารถใช้งานได้ดังนี้:

<RemoteRequireHttps()> _
Public Class SomeController

    <RemoteRequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

สะอาดกว่าเยอะ! ระบุรหัสที่ไม่ได้ทดสอบของฉันใช้งานได้จริง


ขอบคุณสำหรับอืมแก้ไขโพสต์ให้ฉันแซค คำถามของคุณอยู่ใน C # ดังนั้นฉันจึงโพสต์คำตอบ C # ฉันไม่รู้ว่า VB เกี่ยวข้อง ใครทราบว่ามีวิธีใช้การคอมไพล์ตามเงื่อนไขเพื่อควบคุมแอตทริบิวต์ใน VB หรือไม่หรือเป็นไปไม่ได้
Joel Mueller

ใช่มันใช้ได้กับ C # และใช้ได้กับ VB ด้วย แต่คุณต้องทำซ้ำคำจำกัดความของฟังก์ชัน / คลาสที่ค่อนข้างน่าเกลียด ดูคำตอบที่อัปเดตของฉันด้านบน
Joel Mueller

ขอโทษ ตัวอย่างโค้ด VB เริ่มยากขึ้นเรื่อย ๆ ฉันไม่คิดว่ามันจะสำคัญ ฉันได้อัปเดตคำถามเดิมแล้ว การคอมไพล์ตามเงื่อนไขรอบแอตทริบิวต์ทำงานได้แน่นอนใน C # หรือไม่ ฉันยังไม่ได้ทดสอบ ดูเหมือนจะเป็นวิธีการแก้ปัญหาที่หรูหราและสมบูรณ์แบบ
Zack Peterson

รหัส RemoteRequireHttpsAttribute ของคุณทำงานได้อย่างสมบูรณ์ VB มีความสง่างามมากกว่าการคอมไพล์ตามเงื่อนไข ขอบคุณอีกครั้ง Joel
Zack Peterson

2
ขอบคุณ - นี่คือสิ่งที่ฉันต้องการจริงๆ ไชโย!
davecoulter

65

หากใครต้องการรุ่น C #:

using System;
using System.Web.Mvc;

namespace My.Utils
{
    public class MyRequireHttpsAttribute : RequireHttpsAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.HttpContext != null && filterContext.HttpContext.Request.IsLocal)
            {
                return;
            }

            base.OnAuthorization(filterContext);
        }
    }
}

ตกลงเมื่ออ่านนี้และนี้เป็นมาตรการรักษาความปลอดภัยที่เราควรเพิ่มfilters.Add(new MyRequireHttpsAttribute ());ในFilterConfig?
shaijut

จากคำตอบนี้ฉันได้สร้างโซลูชันสำหรับ MVC 6โดยใช้ตัวกรองใน Startup.cs หรือแอตทริบิวต์สไตล์บนคอนโทรลเลอร์
Nick Niebling

26

มาจาก RequireHttps เป็นแนวทางที่ดี

หากต้องการแก้ไขปัญหาทั้งหมดคุณสามารถใช้ IIS บนเครื่องของคุณด้วยใบรับรองที่ลงนามด้วยตนเองได้เช่นกัน IIS เร็วกว่าเว็บเซิร์ฟเวอร์ในตัวและคุณมีข้อได้เปรียบที่สภาพแวดล้อมการพัฒนาของคุณเหมือนกับการผลิตมากกว่า

Scott Hanselman มีแหล่งข้อมูลที่ยอดเยี่ยมเกี่ยวกับวิธีการใช้ HTTPS ในพื้นที่กับ VS2010 และ IIS Express


ใช่ - จนกว่าคุณจะลองทำการส่งต่อพอร์ตด้วยอุปกรณ์ Mifi wifi Verizon และพบว่าพอร์ต 443 ไม่สามารถส่งต่อได้ !!! # * & # * & $
Simon_Weaver

สิ่งที่ฉันไม่ชอบเกี่ยวกับการใช้ IIS บนเครื่องของคุณด้วยใบรับรองที่ลงชื่อด้วยตนเองคือฉันต้องผ่านขั้นตอนเพิ่มเติมในการปรับใช้เพื่อทดสอบการเปลี่ยนแปลง ฉันคิดว่าถ้าคุณกำลังทดสอบบางอย่างที่เกี่ยวข้องกับความปลอดภัยมากกว่าที่ควรจะเป็น แต่ถ้าคุณแค่ตรวจสอบการเปลี่ยนแปลงเล็กน้อยอื่น ๆ ก็เป็นเรื่องยากที่จะต้องปรับใช้เพื่อหลีกเลี่ยงการที่ Cassini ไม่สามารถรองรับ HTTPS ได้
davecoulter

1
@davecoulter - ใช้ IIS express บน windows เวอร์ชันไคลเอนต์ไม่จำเป็นต้องใช้ Cassini และจะทำงานเหมือนกับ IIS ทุกประการรวมทั้งมีความสามารถ ssl
Erik Funkenbusch

@Mystere Man - ใช่ฉันค้นพบตั้งแต่ความคิดเห็นนั้น ขอบคุณสำหรับเคล็ดลับ :)
davecoulter

ควรเพิ่มข้อมูลเพิ่มเติมหรือลิงก์เกี่ยวกับวิธีดำเนินการดังกล่าว
stephenbayer

12

ใช้ประโยชน์จากระบบกรอง MVC และ Global.asax.cs ฉันสมมติว่าคุณสามารถทำได้ ...

    protected void Application_Start()
    {
      RegisterGlobalFilters(GlobalFilters.Filters);
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleErrorAttribute());
      if(Config.IsProduction) //Some flag that you can tell if you are in your production environment.
      {
        filters.Add(new RequireHttpsAttribute());
      }
    }

ฉันชอบคำตอบนี้เนื่องจากเกี่ยวข้องกับการตรวจสอบหนึ่งครั้งต่ออายุการใช้งานของแอปพลิเคชันแทนที่จะใช้ตัวกรองใหม่ที่จะถูกเรียกใช้งานทุกคำขอ
Abdulhameed

10

เนื่องจากเป็นเซิร์ฟเวอร์การพัฒนา ASP.Net ที่ทำให้เกิดปัญหาของคุณตั้งแต่แรกจึงเป็นที่น่าสังเกตว่าตอนนี้ Microsoft มีIIS Expressซึ่งมาพร้อมกับ Visual Studio (ตั้งแต่ VS2010 SP1) นี่คือ IIS เวอร์ชันย่อส่วนที่ใช้งานง่ายเหมือนกับเซิร์ฟเวอร์สำหรับการพัฒนา แต่รองรับชุดคุณลักษณะทั้งหมดของ IIS 7.5 รวมถึง SSL

สกอตต์ Hanselman มีการโพสต์รายละเอียดเกี่ยวกับการทำงานร่วมกับ SSL ใน IIS ด่วน


9

วิธีการสืบทอดแอตทริบิวต์ RequireHttps ในแอตทริบิวต์ที่กำหนดเอง จากนั้นภายในแอตทริบิวต์ที่กำหนดเองของคุณให้ตรวจสอบคุณสมบัติ IsLocal ของคำขอปัจจุบันเพื่อดูว่าคำขอนั้นมาจากเครื่องภายในหรือไม่ ถ้าเป็นเช่นนั้นอย่าใช้ฟังก์ชันพื้นฐาน มิฉะนั้นให้เรียกใช้การดำเนินการฐาน


4

นี้ทำงานสำหรับฉันMVC 6 (ASP.NET หลัก 1.0) โค้ดจะตรวจสอบว่าการดีบักอยู่ระหว่างการพัฒนาหรือไม่และไม่จำเป็นต้องใช้ ssl การแก้ไขทั้งหมดที่อยู่ในStartup.cs

เพิ่ม:

private IHostingEnvironment CurrentEnvironment { get; set; }

เพิ่ม:

public Startup(IHostingEnvironment env)
{
    CurrentEnvironment = env;
}

แก้ไข:

public void ConfigureServices(IServiceCollection services)
{
    // additional services...

    services.AddMvc(options =>
    {
        if (!CurrentEnvironment.IsDevelopment())
        {
            options.Filters.Add(typeof(RequireHttpsAttribute));
        }
    });
}

3

หากคุณสามารถรับและลบล้างได้ - ทำ ถ้าคุณทำไม่ได้ - MVC มาพร้อมกับแหล่งที่มาให้ใช้แหล่งที่มาและสร้างแอตทริบิวต์ [ForceHttps] ของคุณเองที่ตรวจสอบ IsLocal


3

สำหรับ MVC 3 ฉันเพิ่ม FilterProvider ของตัวเอง (ตามรหัสที่นี่: ทั่วโลกและมีเงื่อนไขการกรองที่เหนือสิ่งอื่นใด (แสดงข้อมูลการแก้ปัญหาสำหรับผู้ใช้ในประเทศอื่น ๆ ) จะตกแต่งด้วยการกระทำทั้งหมดเมื่อRequireHttpsAttributeHttpContext.Request.IsLocal == false


หรือคุณสามารถเพิ่มตามเงื่อนไขลงในคอลเล็กชันตัวกรองส่วนกลางเมื่อคำขอเป็นแบบโลคัล โปรดทราบว่าคุณจะต้องตรวจสอบสิ่งนี้ในบล็อก try / catch หากแอปถูกตั้งค่าให้เริ่มต้นทันทีเนื่องจากอาจไม่มีคำขอ
tvanfosson

3

หลังจากค้นคว้า aroud แล้วฉันสามารถแก้ปัญหานี้ได้ด้วย IIS Express และการแทนที่เมธอด OnAuthorization ของคลาส Controller (Ref # 1) ฉันได้ไปกับเส้นทางที่แนะนำโดย Hanselman (Ref # 2) อย่างไรก็ตามฉันไม่พอใจกับโซลูชันทั้งสองนี้อย่างสมบูรณ์เนื่องจากเหตุผลสองประการ: 1. OnAuthorization ของ Ref # 1 ใช้งานได้ในระดับการดำเนินการเท่านั้นไม่ใช่ในระดับคลาสคอนโทรลเลอร์ 2 Ref # 2 ต้องการการตั้งค่าจำนวนมาก (Win7 SDK สำหรับ makecert ), คำสั่ง netsh และในการใช้พอร์ต 80 และพอร์ต 443 ฉันต้องเปิด VS2010 ในฐานะผู้ดูแลระบบซึ่งฉันขมวดคิ้ว

ดังนั้นฉันจึงคิดวิธีแก้ปัญหานี้ที่เน้นความเรียบง่ายโดยมีเงื่อนไขต่อไปนี้:

  1. ฉันต้องการใช้ Attbbute RequireHttps ที่ระดับ Controller หรือระดับการกระทำ

  2. ฉันต้องการให้ MVC ใช้ HTTPS เมื่อมีแอตทริบิวต์ RequireHttps และใช้ HTTP หากไม่มี

  3. ฉันไม่ต้องการที่จะต้องเรียกใช้ Visual Studio ในฐานะผู้ดูแลระบบ

  4. ฉันต้องการใช้พอร์ต HTTP และ HTTPS ใด ๆ ที่ IIS Express กำหนด (ดูหมายเหตุ # 1)

  5. ฉันสามารถใช้ใบรับรอง SSL ที่ลงชื่อด้วยตนเองของ IIS Express ซ้ำได้และฉันไม่สนใจว่าฉันจะเห็นข้อความแจ้ง SSL ที่ไม่ถูกต้องหรือไม่

  6. ฉันต้องการให้ dev ทดสอบและการผลิตมีฐานรหัสเดียวกันและไบนารีเดียวกันและเป็นอิสระจากการตั้งค่าเพิ่มเติม (เช่นการใช้ netsh, mmc cert snap-in ฯลฯ ) ที่สุด

ตอนนี้ด้วยพื้นหลังและคำอธิบายที่ไม่ชัดเจนฉันหวังว่ารหัสนี้จะช่วยใครบางคนและประหยัดเวลาได้บ้าง โดยทั่วไปให้สร้างคลาส BaseController ที่สืบทอดมาจาก Controller และรับคลาสคอนโทรลเลอร์ของคุณจากคลาสพื้นฐานนี้ เนื่องจากคุณได้อ่านมาจนถึงตอนนี้ฉันคิดว่าคุณรู้วิธีดำเนินการเหล่านี้ ขอให้มีความสุขกับการเขียนโค้ด!

หมายเหตุ # 1: ทำได้โดยการใช้ฟังก์ชันที่มีประโยชน์ 'getConfig' (ดูรหัส)

Ref # 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html

Ref # 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx

========== รหัสใน BaseController ===================

     #region Override to reroute to non-SSL port if controller action does not have RequireHttps attribute to save on CPU 
    // By L. Keng, 2012/08/27
    // Note that this code works with RequireHttps at the controller class or action level.
    // Credit: Various stackoverflow.com posts and http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        // if the controller class or the action has RequireHttps attribute
        var requireHttps = (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0 
                            || filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0);
        if (Request.IsSecureConnection)
        {
            // If request has a secure connection but we don't need SSL, and we are not on a child action   
            if (!requireHttps && !filterContext.IsChildAction)
            {
                var uriBuilder = new UriBuilder(Request.Url)
                {
                    Scheme = "http",
                    Port = int.Parse(getConfig("HttpPort", "80")) // grab from config; default to port 80
                };
                filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
            }
        }
        else
        {
            // If request does not have a secure connection but we need SSL, and we are not on a child action   
            if (requireHttps && !filterContext.IsChildAction)
            {
                var uriBuilder = new UriBuilder(Request.Url)
                {
                    Scheme = "https",
                    Port = int.Parse(getConfig("HttpsPort", "443")) // grab from config; default to port 443
                };
                filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
            }
        }
        base.OnAuthorization(filterContext);
    }
    #endregion

    // a useful helper function to get appSettings value; allow caller to specify a default value if one cannot be found
    internal static string getConfig(string name, string defaultValue = null)
    {
        var val = System.Configuration.ConfigurationManager.AppSettings[name];
        return (val == null ? defaultValue : val);
    }

============== end code ================

ใน Web.Release.Config ให้เพิ่มสิ่งต่อไปนี้เพื่อล้าง HttpPort และ HttpsPort (เพื่อใช้ค่าเริ่มต้น 80 และ 443)

<appSettings>
<add key="HttpPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="HttpsPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

3

โซลูชันหนึ่งที่คุณสามารถใช้กับการผลิตและเวิร์กสเตชันสำหรับการพัฒนา ขึ้นอยู่กับตัวเลือกของคุณจากการตั้งค่าแอปพลิเคชันใน web.config

<appSettings>
     <!--Use SSL port 44300 in IIS Express on development workstation-->
     <add key="UseSSL" value="44300" />
</appSettings>

หากคุณไม่ต้องการใช้ SSL ให้ลบคีย์ออก หากคุณใช้พอร์ต SSL มาตรฐาน 443 ให้ลบค่าหรือระบุ 443

จากนั้นใช้RequireHttpsAttributeแบบกำหนดเองที่ดูแลเงื่อนไขของคุณ ได้มาจากRequireHttpsจริงและใช้วิธีการพื้นฐานแบบเดียวกันยกเว้นการเพิ่มเงื่อนไข

public class RequireHttpsConditional : RequireHttpsAttribute
{
    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        var useSslConfig = ConfigurationManager.AppSettings["UseSSL"];
        if (useSslConfig != null)
        {
            if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("The requested resource can only be accessed via SSL.");
            }

            var request = filterContext.HttpContext.Request;
            string url = null;
            int sslPort;

            if (Int32.TryParse(useSslConfig, out sslPort) && sslPort > 0)
            {
                url = "https://" + request.Url.Host + request.RawUrl;

                if (sslPort != 443)
                {
                    var builder = new UriBuilder(url) {Port = sslPort};
                    url = builder.Uri.ToString();
                }
            }

            if (sslPort != request.Url.Port)
            {
                filterContext.Result = new RedirectResult(url);
            }
        }
    }
}

อย่าลืมตกแต่งLogOn method ใน AccountController

[RequireHttpsConditional]
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)

และสิ่งนี้ในมุมมองLogOnของคุณเพื่อโพสต์แบบฟอร์มผ่าน https

<% using (Html.BeginFormSecure("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] }, Request.IsSecureConnection, Request.Url)) { %>

ฉันได้รับข้อผิดพลาดนี้: XMLHttpRequest ไม่สามารถโหลดm.XXX.com/Auth/SignIn ไม่มีส่วนหัว "Access-Control-Allow-Origin" ในทรัพยากรที่ร้องขอ Origin ' m.XXX.com ' จึงไม่ได้รับอนุญาตให้เข้าถึง
Ranjith Kumar Nagiri

2

ดังที่ Joel กล่าวถึงคุณสามารถแก้ไขการรวบรวมโดยใช้#if !DEBUGคำสั่ง

ฉันเพิ่งค้นพบว่าคุณสามารถเปลี่ยนค่าของสัญลักษณ์ DEBUG ในองค์ประกอบการคอมไพล์ไฟล์ web.config หวังว่าจะช่วยได้


1

MVC 6 (ASP.NET Core 1.0):

วิธีแก้ปัญหาที่เหมาะสมคือการใช้ env.IsProduction () หรือ env.IsDevelopment () อ่านเพิ่มเติมเกี่ยวกับเหตุผลที่อยู่เบื้องหลังในคำตอบนี้ในวิธีการที่จะต้องใช้ https เฉพาะในการผลิต

คำตอบแบบย่อด้านล่าง (ดูลิงก์ด้านบนเพื่ออ่านเพิ่มเติมเกี่ยวกับการตัดสินใจออกแบบ) สำหรับ 2 สไตล์ที่แตกต่างกัน:

  1. Startup.cs - ลงทะเบียนตัวกรอง
  2. BaseController - สไตล์แอตทริบิวต์

Startup.cs (ลงทะเบียนตัวกรอง):

public void ConfigureServices(IServiceCollection services)
{
    // TODO: Register other services

    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(RequireHttpsInProductionAttribute));
    });
}

BaseController.cs (สไตล์แอตทริบิวต์):

[RequireHttpsInProductionAttribute]
public class BaseController : Controller
{
    // Maybe you have other shared controller logic..
}

public class HomeController : BaseController
{
    // Add endpoints (GET / POST) for Home controller
}

RequireHttpsInProductionAttribute : ทั้งสองอย่างข้างต้นกำลังใช้แอตทริบิวต์ที่กำหนดเองที่สืบทอดมาจากRequireHttpsAttribute :

public class RequireHttpsInProductionAttribute : RequireHttpsAttribute
{
    private bool IsProduction { get; }

    public RequireHttpsInProductionAttribute(IHostingEnvironment environment)
    {
        if (environment == null)
            throw new ArgumentNullException(nameof(environment));
        this.IsProduction = environment.IsProduction(); 
    }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (this.IsProduction)
            base.OnAuthorization(filterContext);
    }
    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        if(this.IsProduction)
            base.HandleNonHttpsRequest(filterContext);
    }
}

1

นี่เป็นวิธีที่สะอาดที่สุดสำหรับฉัน ในApp_Start\FilterConfig.csไฟล์ของฉัน ไม่สามารถเรียกใช้รุ่นรุ่นได้อีกต่อไป

... 
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
        if (!Web.HttpContext.Current.IsDebuggingEnabled) {
            filters.Add(new RequireHttpsAttribute());   
        }
        ...
}

หรือคุณสามารถตั้งค่าให้ต้องใช้ https เมื่อเปิดหน้าข้อผิดพลาดที่กำหนดเองเท่านั้น

... 
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
        if (Web.HttpContext.Current.IsCustomErrorEnabled) {
            filters.Add(new RequireHttpsAttribute());   
        }
        ...
}

นี่เป็นวิธีง่ายๆที่ใช้งานได้ดีใน MVC 5 :)
MWD

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