asp.net c#如何从http重定向到https?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

所以在我的代码中,我想检测我的登录页面是否被称为http,并将其重定向到https。

我知道有非代码的方式,但对于令人沮丧的技术性问题,我被支持在代码中进行。

            if (!Request.IsSecureConnection)
            {
                string redirectUrl = Request.Url.ToString().Replace("http:", "https:");
                Response.Redirect(redirectUrl);
            }

所以我把它放在我的Page_Load(...),确保我的调试器使用真正的IIS,而不是VS2008s IIS,并点击调试。

在调试器中,命中Response.Redirect(“ https://localhost/StudentPortal3G/AccessControl/AdLogin.aspx ”),命中f5。

获取“Internet Explorere无法显示网页,url是HTTP,而不是HTTPS。没有收到信息错误...同样的事情不会在调试器中运行。

那么我错过了什么?它似乎不是火箭科学,我在很多博客上看到过类似的代码。

我究竟做错了什么?我认为它必须是一个非常明显的新秀错误,但我没有看到它。

提问于
用户回答回答于

我也会做!Request.IsLocal,以确保我没有调试,但如果你使用的是一个真正的IIS实例,并且在调试时应用了一个证书,这应该不是问题。

if (!Request.IsLocal && !Request.IsSecureConnection)
{
    string redirectUrl = Request.Url.ToString().Replace("http:", "https:");
    Response.Redirect(redirectUrl, false);
    HttpContext.ApplicationInstance.CompleteRequest();
}

注意:这个答案假定一个Controller内的MVC上下文,其中HttpContext是一个拥有当前上下文的属性。如果不幸仍然使用WebForms或以退化方式引用上下文,则需要使用HttpContext.Current.ApplicationInstance.CompleteRequest()

注意:我已经更新了这一点,以便与根据框架文档终止请求的建议模式保持一致。

当您在页面处理程序中使用此方法来终止一个页面的请求并为另一个页面启动一个新请求时,请将endResponse设置为false,然后调用CompleteRequest方法。如果为endResponse参数指定true,则此方法会为原始请求调用End方法,该方法在完成时会引发ThreadAbortException异常。此异常对Web应用程序性能有不利影响,因此建议为endResponse参数传递false。有关更多信息,请参阅End方法。

用户回答回答于

我通常从OnPreInit中调用以下所有页面继承的基类中的以下内容。当然,你可以在每一页都做到这一点......但你现在不想这么做吗?

请注意,我为每个页面提供了两个属性,以便我可以为每个页面指定SSL需求(RequiresSSL),而我也可以覆盖和重定向检查(如果需要)(使用IgnoreRequiresSSL,这对于像错误页面这样的页面有帮助重写并不知道它们是否会被加密),但当然,可以删除这些简单的设置。

    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);

        if (!IsPostBack)
            RedirectAccordingToRequiresSSL();

        ...
    }

    /// <summary>
    /// Redirect if necessary to ssl or non-ssl enabled URL dependant on RequiresSSL property setting.
    /// </summary>
    private void RedirectAccordingToRequiresSSL()
    {
        if (IgnoreRequiresSSL) return;

        if (RequiresSSL)
        {
            if (!Request.IsSecureConnection) // Need to redirect to https
                RedirectAccordingToRequiresSSL(Uri.UriSchemeHttps);
        }
        else if (Request.IsSecureConnection)
        {
            RedirectAccordingToRequiresSSL(Uri.UriSchemeHttp);
        }

        // Otherwise don't need to do any redirecting as already using the correct scheme
    }

    /// <summary>
    /// Redirect as requested to specified scheme
    /// </summary>
    /// <param name="scheme"></param>
    private void RedirectAccordingToRequiresSSL(string scheme)
    {
        var url = scheme + Uri.SchemeDelimiter + Request.Url.Authority + Request.Url.PathAndQuery;
        Response.Redirect(url, false);
    }

扫码关注云+社区