Подтвердить что ты не робот

С# Как определить, HTTPS

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

4b9b3361

Ответ 1

Вы можете написать 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 или нет.

EDIT: и, конечно же, не забудьте добавить определение модуля в 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>

Ответ 2

Немного жестко закодировано, но спрятано!

if (!HttpContext.Current.Request.IsSecureConnection)
{
   Response.Redirect("https://www.foo.com/foo/");
}

Ответ 3

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

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 на всем сайте.

Ответ 4

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

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

Ответ 5

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

Ответ 6

Вы также можете настроить правило перезаписи в свой 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>