Я работаю над проектом, который имеет одну страницу, которая должна использовать сертификат SSL. Все ссылки в сайте к этой странице используют https вместо http, но в случае, по которому пользователь может переместиться непосредственно к странице, которую я хочу, чтобы http версия страницы перенаправила к себе, но использовала https.
Я могу сделать Ответ. Перенаправление в page_load событии. Я могу записать JavaScript, который обновит location.href, который вызовет обратную передачу. Я уверен, что существует больше способов освежевать эту кошку.
Мой вопрос, какова лучшая практика для сайта ASP.NET на IIS 6 или 7 для перенаправления http страницы к https? Существует ли лучшая практика, или все альтернативы равны?
Для этого я бы использовал перезапись URL. Почему? потому что он прост в реализации, не требует изменений в приложении и прост в обслуживании.
В IIS7 это можно сделать с помощью модуля перезаписи URL , например:
<!-- http:// to https:// rule -->
<rule name="ForceHttpsBilling" stopProcessing="true">
<match url="(.*)billing/(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" />
</rule>
В IIS6 вы необходимо использовать стороннюю библиотеку. Я использую IIRF ( http://www.codeplex.com/IIRF ), он бесплатный, стабильный и имеет большое количество функций.
На самом деле лучше всего сделать это в одно из трех мест, предполагая, что оборудование или настройки IIS не подходят. Просто укажите параметры.
Все это было бы хорошими вариантами. Один и два гарантированно попадут в каждый запрос, обрабатываемый ASP.NET. Третий требует, чтобы вы убедились, что все ваши страницы унаследованы от базовой страницы.
Я бы не стал помещать код на каждую страницу, это просто плохое программирование.
Дайте мне знать, если вам нужны дополнительные разъяснения,
Я бы назвал Response.Redirect в page_load. Это проще, чем создание javascript, и отправляет меньше байтов клиенту.
В общем, есть определенные части сайта, которые вы либо хотите, чтобы всегда был HTTPS, либо HTTP.
Я использую следующий атрибут действия для преобразования трафика либо в тот, либо в другой:
public class ForceConnectionSchemeAttribute : ActionFilterAttribute
{
private string scheme;
public ForceConnectionSchemeAttribute(string scheme)
{
this.scheme = scheme.ToLower();
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Uri url = filterContext.HttpContext.Request.Url;
if (url.Scheme != scheme)
{
string secureUrl = String.Format("{0}://{1}{2}", scheme, url.Host, url.PathAndQuery);
filterContext.Result = new RedirectResult(secureUrl);
}
}
}
// Suppose I always want users to use HTTPS to access their personal info:
[ForceConnectionScheme("https")]
public class UserController: Controller
{
// blah
}