2016-08-29 2 views
0

Я пытаюсь реализовать HTTPS на отдельных страницах моего сайта. Использование атрибута RequireHttps работает, но вызывает проблемы при тестировании, поскольку у нас нет сертификата, установленного локально.RequireHttps vs from RequireHttpsAttribute

Решение, которое я ищу, должно будет игнорировать localhost и игнорировать один тестовый сервер во время работы на нашем втором тестовом сервере, где у нас есть сертификат.

Некоторые дополнительные фона на этом. Целью является постепенное перемещение сайта на https. Это сайт электронной торговли, поэтому очевидно, что части уже безопасны, и я знаю, что по многим причинам перемещение всего сайта на безопасное - это хорошо. Я также знаю, что как только вы перейдете с страницы A на страницу B, где B будет защищен, тогда он не вернется к HTTP, когда вы вернетесь к A, это нормально. Я хочу переместить сайт поэтапно на случай, если есть проблемы с такими вещами, как несоответствующий контент, карты сайта, SEO, рейтинг google и т. Д.

Некоторые из различных решений, которые я пробовал - я реализовал полученный класс от RequireHttps атрибута следующим образом:

public class CustomRequireHttps : RequireHttpsAttribute 
{ 
    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.Url != null && (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase) 
                   && !String.Equals(filterContext.HttpContext.Request.HttpMethod, "HEAD", StringComparison.OrdinalIgnoreCase) 
                   && !filterContext.HttpContext.Request.Url.Host.Contains("localhost") 
                   && !filterContext.HttpContext.Request.Url.Host.Contains("testing"))) 
     { 
      base.HandleNonHttpsRequest(filterContext); 
     } 
    } 
} 

И применили этот атрибут на одну страницу, но он не работал должным образом, он либо применяет HTTPS для всех страниц на сайте или не работает вообще.

Я также попытался это решение, которое работает, но только на локальном хосте, а не на двух тестовых серверах:

#if !DEBUG 
[RequireHttps] 
#endif 

Затем я попытался переопределение метода OnAuthorizartion как так:

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); 
    } 

Он работал локально, но как только я получил его на сервере с тестовым сертификатом, вдруг каждая страница HTTPS, которую я не понимаю, поскольку я использовал этот производный атрибут только на одной странице.

Итак, я хочу достичь HTTPS на выбранном числе страниц на моем сайте. Этот HTTPS-запрос необходимо игнорировать на локальном хосте и первом тестовом сервере, но ему необходимо NOT игнорировать на втором тестовом сервере, имеющем сертификат.

Пока это либо не работает вообще, либо находится на каждой странице сайта.

Однако, это кикер. Если я использую атрибут RequireHttps, он отлично работает на втором тестовом сервере, но вызывает проблемы на всех серверах без сертификата. «Прекрасно работает», я имею в виду, что он реализует HTTPS только на тех страницах, где я использовал этот атрибут, и не переключает все страницы на безопасные.

Любые идеи, что я делаю неправильно здесь?

ответ

0

Может произойти много, например, когда ваши ссылки являются локальными, когда переключатель сделан на HTTPS, все страницы HTTPS (без применения HTTPS не переключается на HTTP). С точки зрения безопасности вы должны обслуживать все страницы из HTTPS, когда вам это нужно, для подмножества страниц (в противном случае вы можете делиться безопасными куки-файлами cookie/входами через незашифрованный HTTP). Так что, вероятно, ваш атрибут применяется, и все последующие запросы подаются через SSL.

Во-вторых, тестирование по запросу localhost uri будет обслуживать страницу через HTTP на вашем втором сервере. Мое мнение для решения этой проблемы - создать переключатель в вашем web.config, если страницы должны быть переданы через HTTPS.Проверьте этот переключатель в своем глобальном filterConfig:

public static class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     var useSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["useSsl"]); 
     if (useSsl) 
     { 
      filters.Add(new RequireHttpsAttribute()); 
     } 
    } 
} 
+0

Это как наша текущая система работает, и все в порядке, за исключением того, что она не позволяет выборочной реализации HTTPS. Я понимаю, что, когда вы находитесь в безопасном соединении, он не переключается обратно, и это прекрасно. Цель здесь состоит в том, чтобы в конечном итоге переместить весь сайт на HTTPS, но сделать это на разных этапах. Поэтому в тот момент, когда вы отправляетесь на проверку, это очевидно, но я хочу также добавить одну или две другие страницы, которые являются безопасными. Если с ними нет проблем, переместите еще один или два ... и так далее. –

Смежные вопросы