C # Как определить, если HTTPS - PullRequest
16 голосов
/ 13 июля 2009

Как определить и заставить пользователей просматривать мой сайт только по HTTPS? Я знаю, что это можно сделать через IIS, но хочу знать, как это делается программно.

Ответы [ 6 ]

20 голосов
/ 13 июля 2009

Вы можете написать HttpModule так:

/// <summary>
/// Used to correct non-secure requests to secure ones.
/// If the website backend requires of SSL use, the whole requests 
/// should be secure.
/// </summary>
public class SecurityModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication application)
    {
        application.BeginRequest += new EventHandler(application_BeginRequest);
    }

    protected void application_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = ((HttpApplication)(sender));
        HttpRequest request = application.Request;
        HttpResponse response = application.Response;

        // if the secure connection is required for backend and the current 
        // request doesn't use SSL, redirecting the request to be secure
        if ({use SSL} && !request.IsSecureConnection)
        {
            string absoluteUri = request.Url.AbsoluteUri;
            response.Redirect(absoluteUri.Replace("http://", "https://"), true);
        }
    }
}

Где {use SSL} - это условие, использовать ли SSL или нет.

РЕДАКТИРОВАТЬ : и, конечно, не забудьте добавить определение модуля в web.config:

<system.web>
    <httpModules>
        <!--Used to redirect all the unsecure connections to the secure ones if necessary-->
        <add name="Security" type="{YourNamespace}.Handlers.SecurityModule, {YourAssembly}" />
        ...
    </httpModules>
</system.web>
12 голосов
/ 08 февраля 2013

Немного жестко, но просто!

if (!HttpContext.Current.Request.IsSecureConnection)
{
   Response.Redirect("https://www.foo.com/foo/");
}
5 голосов
/ 13 июля 2009

Вы должны конвертировать это из VB.NET в C #, но это то, что я использую на своих сайтах:

Imports System.Web.HttpContext

Public Shared Sub SetSSL(Optional ByVal bEnable As Boolean = False)
  If bEnable Then
    If Not Current.Request.IsSecureConnection Then
      Dim strHTTPS As String = "https://www.mysite.com"
      Current.Response.Clear()
      Current.Response.Status = "301 Moved Permanently"
      Current.Response.AddHeader("Location", strHTTPS & Current.Request.RawUrl)
      Current.Response.End()
    End If
  Else
    If Current.Request.IsSecureConnection Then
      Dim strHTTP As String = "http://www.mysite.com"
      Current.Response.Clear()
      Current.Response.Status = "301 Moved Permanently"
      Current.Response.AddHeader("Location", strHTTP & Current.Request.RawUrl)
      Current.Response.End()
    End If
  End If
End Sub

Это больше кода, чем некоторые другие методы, но есть причина для этого. Этот метод будет перенаправлять только тогда, когда он не находится в режиме, в котором он должен быть. И когда он выполняет перенаправление, он выполняет перенаправление 301 (постоянное). Преимущество заключается в том, что поисковые системы будут следовать перенаправлению 301, и это предотвратит любую возможность их индексации одной и той же страницы дважды (в режиме http и https). Вы можете сравнить это с поведением по умолчанию Response.Redirect (302 временное перенаправление), которое, например, Google не обрабатывает аналогичным образом. Они не будут изменять свой индекс на основе временного перенаправления.

Итак, если вы находитесь на странице, которую хотите зашифровать с помощью SSL, назовите ее так:

SetSSL (True)

В противном случае:

SetSSL (False)

И если вам действительно нужно, чтобы это применялось глобально, я бы вызвал SetSSL (True) в Application_BeginRequest вашего global.asax. Помните, что SSL немного замедлит работу. По этой причине я обычно очень избирателен при переключении между http и https. На самом деле, из десятков сайтов, которые я разработал, только два используют SSL на всем сайте.

2 голосов
/ 13 июля 2009

В этой статье рассматриваются перемещения запросов в и из SSL. Иногда вы не хотите, чтобы пользователь просматривал страницу в SSL, потому что он записывает циклы обработки для страниц, которые не нужно защищать.

http://weblogs.asp.net/kwarren/archive/2005/07/08/418541.aspx

1 голос
/ 23 марта 2010

IIR вы можете проверить запрос (HttpContext.Current.Request) для домена, который вы затем можете проверить, какой протокол используется (http, https, ftp и т. Д.)

0 голосов
/ 09 августа 2017

Вы также можете настроить правило перезаписи в файле web.config под тегом system.webServer. например:

   <rewrite>
      <rules>
        <rule name="Redirect to HTTPS" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost(:\d+)?$" negate="true" ignoreCase="true" />
            <add input="{HTTP_HOST}" matchType="Pattern" pattern="^127\.0\.0\.1(:\d+)?$" negate="true" />
            <add input="{HTTPS}" pattern="off" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
      </rules>
    </rewrite>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...