C#如何确定HTTPS(C# How to determine if HTTPS)

2019-06-25 18:21发布

如何确定,并强制用户使用HTTPS只浏览到我的网站? 我知道它可以通过IIS来完成,但是要懂得它的编程方式完成的。

Answer 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与否。

编辑 :和,当然,不要忘了模块定义添加到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>


Answer 2:

有点硬编码的,但简单明了!

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


Answer 3:

你得从这个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临时重定向)进行比较。 基于临时重定向他们不会改变自己的指数。

所以,如果你要使用SSL加密的网页上,这样称呼它:

SetSSL(真)

除此以外:

SetSSL(假)

如果你真的需要这是全球范围内应用,我会打电话给你的global.asax的的Application_BeginRequest SetSSL(真)。 要注意的是SSL会慢下来一点。 出于这个原因,我通常HTTP和HTTPS之间切换时非常有选择性。 事实上,从很多网站的我已经开发了这里只有过两次使用整个网站的SSL。



Answer 4:

本文介绍进出SSL的移动请求。 有时候,你不希望用户在SSL浏览的网页,因为它燃烧PROC周期为不需要被保护的网页。

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



Answer 5:

IIR你可以检查域,您则可以检查正在使用什么协议的请求(HttpContext.Current.Request)(HTTP,HTTPS,FTP等)



Answer 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>


文章来源: C# How to determine if HTTPS