سؤال

منذ حوالي 6 أشهر قمت بإطلاق موقع حيث يجب أن يكون كل طلب عبر https.الطريقة الوحيدة في ذلك الوقت التي تمكنت من التأكد من أن كل طلب إلى صفحة ما كان عبر https هو التحقق من ذلك في حدث تحميل الصفحة.إذا لم يكن الطلب قد تجاوز http، فسوف أقوم بإعادة التوجيه("https://example.com")

هل هناك طريقة أفضل - من الناحية المثالية بعض الإعدادات في web.config؟

هل كانت مفيدة؟

المحلول

الرجاء استخدام HSTS

من 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 ديسمبر 2015)

أساسًا

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

نصائح أخرى

والشيء الآخر الذي يمكنك القيام به هو استخدام 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 سوف تتجاهل الرأس فقط ولكن سيتم اكتشافها بواسطة بيان التبديل وإرسالها إلى HTTPS.

ستتيح لك وحدة 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>

لأولئك الذين يستخدمون 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 عبر الموقع.لا تنس إضافة توجيه التحميل المسبق أدناه وإرسال موقعك إلى موقع التحميل المسبق HSTS.معلومات اكثر هنا و هنا.لاحظ أنه إذا كنت لا تستخدم 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 مستخدم. سياسة أمان المحتوى (CSP) رأس HTTP و سلامة الموارد الفرعية (SRI) لا تلعب بشكل جيد عندما تقلد المخطط في بعض المتصفحات.من الأفضل أن تكون واضحًا بشأن HTTPS.على سبيل المثال

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

الطريق السهل

استخدم ال ASP.NET MVC النموذجي قالب مشروع Visual Studio لإنشاء مشروع يتضمن كل هذا وأكثر من ذلك بكثير.يمكنك أيضًا عرض الكود على جيثب.

إذا لم تتمكن من إعداد هذا في 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) قم بإضافة مفتاح داخل 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);
            }
        }
    }
}

إذا كان دعم SSL غير قابل للتكوين في موقعك (على سبيل المثال.يجب أن تكون قادرًا على تشغيل/إيقاف https) - يمكنك استخدام السمة [RequireHttps] في أي إجراء تحكم/وحدة تحكم ترغب في تأمينه.

يعتمد ذلك أيضًا على العلامة التجارية للموازن الخاص بك، بالنسبة لـ web mux، ستحتاج إلى البحث عن رأس http X-WebMux-SSL-termination: true لمعرفة أن حركة المرور الواردة كانت SSL.التفاصيل هنا: http://www.cainetworks.com/support/redirect2ssl.html

بالنسبة إلى @Joe أعلاه، "هذا يعطيني حلقة إعادة توجيه.قبل أن أضيف الكود كان يعمل بشكل جيد.أي اقتراحات؟- جو 8 نوفمبر 2011 الساعة 4:13"

كان هذا يحدث لي أيضًا وما أعتقد أنه كان يحدث هو أنه كان هناك موازن تحميل ينهي طلب 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;
        }
    }

انا ذاهب لرمي سنتي في. لو لديك حق الوصول إلى جانب خادم IIS، ثم يمكنك فرض HTTPS باستخدام روابط البروتوكول.على سبيل المثال، لديك موقع على شبكة الانترنت يسمى بلاه.في IIS يمكنك إعداد موقعين: بلاه, ، و بلا (إعادة توجيه)بلاه تكوين فقط HTTPS ملزمة (و FTP إذا كنت بحاجة إلى ذلك، فتأكد من فرضه عبر اتصال آمن أيضًا).ل بلا (إعادة توجيه) تكوين فقط HTTP ربط.وأخيرا، في إعادة توجيه HTTP قسم ل بلا (إعادة توجيه) تأكد من تعيين إعادة التوجيه 301 إلى https://blah.com, ، مع تمكين الوجهة المحددة.تأكد من أن كل موقع في IIS يشير إلى موقعه ملك المجلد الجذر وإلا فإن Web.config سوف تحصل على كل ثمل.تأكد أيضًا من وجود HSTS تم تكوينه على موقع HTTPSed الخاص بك بحيث يتم دائمًا فرض الطلبات اللاحقة بواسطة المتصفح على HTTPS ولا تحدث أي عمليات إعادة توجيه.

هذه إجابة أكمل بناءً علىTroy Hunt's.أضف هذه الوظيفة إلى 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 على البناء المحلي الخاص بك، قم بتمكينه في شريط الخصائص للمشروع)

-> ما عليك سوى إضافة [RequireHttps] أعلى الفئة العامة HomeController:مراقب.

-> وأضف GlobalFilters.Filters.Add(new RequireHttpsAttribute());في طريقة "Apple_Start ()" الفارغة المحمية" في ملف Global.asax.cs.

مما يفرض تطبيقك بالكامل على HTTPS.

لقد أمضيت بعض الوقت في البحث عن أفضل الممارسات المنطقية ووجدت ما يلي والذي كان مثاليًا بالنسبة لي.آمل أن ينقذك هذا في وقت ما.

استخدام ملف التكوين (على سبيل المثال موقع asp.net)https://blogs.msdn.microsoft.com/kaushal/2013/05/22/http-to-https-redirects-on-iis-7-x-and-higher/

أو على الخادم الخاص بك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>

إذا كنت تستخدم ASP.NET Core، فيمكنك تجربة الحزمة nuget SaadOut.AspNetCore.HttpsWithStrictTransportSecurity.

ثم ما عليك سوى الإضافة

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

سيؤدي هذا أيضًا إلى إضافة رأس HTTP StrictTransportSecurity إلى جميع الطلبات المقدمة باستخدام نظام https.

مثال على التعليمات البرمجية والوثائق https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

في IIS10 (Windows 10 وServer 2016)، بدءًا من الإصدار 1709 فصاعدًا، يوجد خيار جديد وأبسط لتمكين HSTS لموقع ويب.

تصف مايكروسوفت مزايا النهج الجديد هنا, ، وتقديم العديد من الأمثلة المختلفة حول كيفية تنفيذ التغيير برمجيًا أو عن طريق التحرير المباشر لملف 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 في تلك المقالات خيارات أفضل إذا كنت في بيئة مستضافة حيث يكون وصولك محدودًا.

ضع في اعتبارك أن الإصدار 1709 من IIS10 متوفر على نظام التشغيل Windows 10 الآن، ولكن بالنسبة لنظام التشغيل Windows Server 2016 فهو على مسار إصدار مختلف، ولن يتم إصداره كتصحيح أو حزمة خدمة.يرى هنا للحصول على تفاصيل حول 1709.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top