Лучший способ в asp.net заставить HTTPS для всего сайта?

Около 6 месяцев назад я развернул сайт, где каждый запрос должен был быть через https. В то время я мог найти единственный способ убедиться, что каждый запрос к странице превышал https, - это проверить это в событии загрузки страницы. Если бы запрос не был более http, я бы ответил. redirect (" https: // пример. com ")

Есть ли лучший способ - в идеале, некоторые настройки в Интернете. конфиг?

вопрос задан 5.09.2008
codethrift
982 репутация

14 ответов


  • 0 рейтинг

    Другое, что вы можете сделать, это использовать 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.

    ответ дан Troy Hunt, с репутацией 14579, 22.11.2011
  • 0 рейтинг

    Если по какой-либо причине вы не можете настроить это в IIS, я бы сделал модуль HTTP, который выполняет перенаправление для вас:

    using System;
    using System.Web;
    
    namespace HttpsOnly
    {
        /// 
    /// Redirects the Request to HTTPS if it comes in on an insecure channel. ///
     
        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, добавьте в качестве ссылки на ваш проект и разместите в Интернете. конфиг:

     
          
     
    
    ответ дан FlySwat, с репутацией 110216, 6.09.2008
  • 0 рейтинг

    Я собираюсь бросить мои два цента. ЕСЛИ у вас есть доступ к стороне сервера IIS, то вы можете принудительно установить HTTPS с помощью привязок протокола. Например, у вас есть веб-сайт Blah . В IIS вы можете настроить два сайта: Blah и Blah (Redirect) . Для Blah сконфигурируйте только привязку HTTPSFTP, если вам нужно, не забудьте также принудительно установить ее через безопасное соединение). Для Blah (Redirect) настройте только привязку HTTP. И наконец, в разделе HTTP Redirect для Blah (Redirect) убедитесь, что для перенаправления 301 установлено значение https://blah.com с точным назначением. Убедитесь, что каждый сайт в IIS указывает на собственную собственную корневую папку , в противном случае - Web. конфиг все испортит. Также убедитесь, что на вашем сайте HTTPSed настроено HSTS, чтобы последующие запросы браузера всегда были принудительно настроены на HTTPS и не происходили переадресации.

    ответ дан Gup3rSuR4c, с репутацией 5133, 12.11.2015
  • 0 рейтинг

    Модуль IIS7 позволит вам перенаправить.

        
            
                
                    
                    
                        
                    
                    
                
            
        
    
    ответ дан Mark, с репутацией 8091, 15.02.2010
  • 0 рейтинг

    Это более полный ответ, основанный на @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 в локальной сборке, включите его в доке свойств проекта)

    ответ дан noelicus, с репутацией 9467, 10.09.2016
  • 0 рейтинг

    - & gt; Просто ДОБАВЬТЕ [RequireHttps] поверх общедоступного класса HomeController: Controller.

    - & gt; И добавить GlobalFilters. Фильтры. Добавить (новый RequireHttpsAttribute ()); в методе защищенного void Application_Start () в Global. asax. CS файл.

    Который заставляет все ваше приложение к HTTPS.

    ответ дан Santosh K, с репутацией 35, 13.03.2016
  • 0 рейтинг

    Что вам нужно сделать, это:

    1) Добавить ключ внутри сети. config, в зависимости от производственного или промежуточного сервера, как показано ниже

    
                 or
    
    

    2) Внутри вашего Глобала. 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);
                }
            }
        }
    }
    
    ответ дан Chandan Kumar, с репутацией 3037, 7.10.2014
  • 0 рейтинг

    Если вы используете ASP. NET Core вы можете попробовать пакет Nuget SaidOut. AspNetCore. HttpsWithStrictTransportSecurity.

    Тогда вам нужно всего лишь добавить

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

    Это также добавит заголовок HTTP StrictTransportSecurity ко всем запросам, выполненным по схеме https.

    Пример кода и документация https: // github. com / saidout / saidout-aspnetcore-httpswithstricttransportsecurity # пример-код

    ответ дан user7755300, с репутацией 1, 23.03.2017
  • 0 рейтинг

    Для @Joe выше: «Это дает мне цикл перенаправления. До того, как я добавил код, он работал нормально. Какие-либо предложения? - Джо 8 ноября 2011 года в 4:13 "

    Это также происходило со мной, и я думаю, что происходило то, что балансировщик нагрузки прерывал запрос SSL перед веб-сервером. Так что мой веб-сайт всегда думал, что запрос был «http», даже если оригинальный браузер запрашивал, чтобы он был «https».

    Я признаю, что это немного глупо, но для меня сработало создание свойства JustRedirected, которое я мог использовать, чтобы выяснить, что человек уже был перенаправлен однажды. Итак, я проверяю конкретные условия, которые требуют перенаправления, и, если они выполняются, я устанавливаю это свойство (значение, сохраненное в сеансе) до перенаправления. Даже если условия http / https для перенаправления выполняются во второй раз, я обхожу логику перенаправления и сбрасываю значение сеанса JustRedirected на false. Вам понадобится ваша собственная логика условного тестирования, но вот простая реализация свойства:

        public bool JustRedirected
        {
            get
            {
                if (Session[RosadaConst.JUSTREDIRECTED] == null)
                    return false;
    
                return (bool)Session[RosadaConst.JUSTREDIRECTED];
            }
            set
            {
                Session[RosadaConst.JUSTREDIRECTED] = value;
            }
        }
    
    ответ дан Paul Schroeder, с репутацией 345, 12.12.2012
  • 0 рейтинг

    Я провел некоторое время в поисках лучших практик, которые имеют смысл, и нашел следующее, которое сработало для меня. Я надеюсь, что это когда-нибудь спасет вас.

    Использование Файл конфигурации (например, asp. чистый сайт) https: // блоги. MSDN. Microsoft. com / kaushal / 2013/05/22 / http-to-https-redirects-on-iis-7-x-and-lower /

    или на вашем собственном сервере https: // www. sslshopper. ком / iis7 переадресовывать-клиента к протоколу HTTPS. HTML

    [КОРОТКИЙ ОТВЕТ] Просто код ниже идет внутри

     
     
         
           
           
            
            
           
           
            
           
     
    
    ответ дан Nour Lababidi, с репутацией 122, 7.09.2018
  • 0 рейтинг

    Это также зависит от марки вашего балансировщика, для веб-мультиплексора вам потребуется поискать заголовок http X-WebMux-SSL-termination: true, чтобы определить, что входящий трафик был ssl. Подробности здесь: http: // www. cainetworks. ком / поддержка / redirect2ssl. HTML

    ответ дан Alexander, с репутацией 19, 16.11.2010
  • 0 рейтинг

    Для тех, кто использует ASP. NET MVC. Вы можете использовать следующее для принудительной установки SSL / TLS через HTTPS на весь сайт двумя способами:

    Трудный путь

    1 - Добавьте атрибут RequireHttpsAttribute к глобальным фильтрам:

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

    2 - Принудительно использовать токены Anti-Forgery для использования SSL / TLS:

    AntiForgeryConfig.RequireSsl = true;
    

    3 - Требовать, чтобы Cookies требовали HTTPS по умолчанию, изменяя Интернет. файл конфигурации:

    
        
    
    

    4 - Используйте NWebSec. Прикрепите пакет NuGet и добавьте следующую строку кода, чтобы активировать Strict Transport Security для всего сайта. Не забудьте добавить директиву предварительной загрузки ниже и отправить свой сайт на сайт предварительной загрузки HSTS . Более подробная информация здесь и здесь . Обратите внимание, что если вы не используете OWIN, есть Интернет. Метод конфигурации, с которым вы можете ознакомиться на сайте NWebSec .

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

    5 - Используйте NWebSec. Прикрепите пакет 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-заголовок и Subresource Integrity (SRI) не играют хорошо, когда вы имитируете схему в некоторых браузерах. Лучше быть явно о HTTPS. е. г.

    
    
    

    Легкий путь

    Используйте ASP . NET MVC Boilerplate Шаблон проекта Visual Studio для создания проекта со всем этим и многим другим встроенным. Вы также можете просмотреть код на GitHub .

    ответ дан Muhammad Rehan Saeed, с репутацией 10636, 18.03.2015
  • 0 рейтинг

    Пожалуйста, используйте HSTS

    от http: // www. Хансельман. ком / блог / HowToEnableHTTPStrictTransportSecurityHSTSInIIS7. aspx

    
    
        
            
                
                    
                        
                        
                            
                        
                        
                    
                
                
                    
                        
                        
                            
                        
                        
                    
                
            
        
    
    

    Оригинальный ответ (заменен вышеуказанным 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);
       }
    }
    

    , что бы пойти в глобальном. asax. CS (или глобальный. asax. VB)

    Я не знаю, как указать это в Интернете. конфиг

    ответ дан John Boker, с репутацией 65958, 5.09.2008
  • 0 рейтинг

    Если поддержка SSL не настраивается на вашем сайте (т.е. должен иметь возможность включать / выключать https) - вы можете использовать атрибут [RequireHttps] для любого действия контроллера / контроллера, которое вы хотите защитить.

    ответ дан yarg, с репутацией 464, 1.06.2014