ASP.net设计问题,如果在HTTPS上,则强制重定向到HTTP

时间:2011-03-25 19:52:30

标签: asp.net http ssl redirect https

在我的母版页上,我有以下功能:

/// <summary>
/// Forces user to use unsecure HTTP connection
/// </summary>
public void FoceUnsecure()
{
    SSLHTTPDirect(false);
}

/// <summary>
/// Forces user to redirect to SSL
/// </summary>
public void ForceSSL()
{
    SSLHTTPDirect(true);
}

/// <summary>
/// Perform the redirect to self
/// </summary>
/// <param name="SSLRequired">True = Force HTTPS, False = Force HTTP</param>
private void SSLHTTPDirect(bool SSLRequired)
{
    if (int.Parse(ConfigurationManager.AppSettings["UseSSL"].ToString()) == 1)
    {
        bool IsOnSSL = HttpContext.Current.Request.Url.Scheme.ToLower() == "https";
        if (SSLRequired && !IsOnSSL)
            Response.Redirect(ConfigurationManager.AppSettings["SecureDomainRoot"] + "" + Request.RawUrl);
        else if (!SSLRequired && IsOnSSL)
            Response.Redirect(ConfigurationManager.AppSettings["MasterDomainRoot"] + "" + Request.RawUrl);
    }
}

在我需要的SSL页面上,它运行正常。我只是做Master.ForceSSL(),如果它们在HTTP上,它会重定向到安全连接。

问题是,我想将所有其他页面重定向到HTTP,如果它们在HTTPS上,而不必手动浏览页面,将函数调用添加到ForceUnsecure()

无论我尝试什么,如果调用了ForceSSL()函数(使用标志等),我似乎无法在Master页面中解决问题。理想情况下,我想要像

这样的东西

if(!SSLRequired && OnHTTPS){ForceUnsecure()}

但无论我尝试什么,主页都会在内容页面调用ForceSSL()之前执行所有检查。所以我永远不会知道内容页面设置的值。

4 个答案:

答案 0 :(得分:1)

在回应评论时,我将其转变为答案:

我知道这不是你问题的直接答案;但是,我觉得这可以说是上了肥皂盒,可以这么说。


首先,如果您拥有的任何内容足够敏感以至于需要用户名和密码,那么您不应该通过在初始登录过程后强行关闭SSL来发送未加密的会话cookie数据来为用户提供帮助。

对于大多数网站,与一个或多个帐户被劫持的情况下失去信任相比,额外带宽和/或处理能力的数量是微不足道的。只有你可以决定是否值得关闭ssl。

如果您认为性能问题可能会超过您的商业信誉,那么请针对您的应用使用标准的分析工具,以确切了解其影响。其中包括一些像YSlow这样的工具,可以直接使用“真正的”现成工具,例如视觉工作室的高端版本。

有价值的链接:
(讨论SSL的性能影响)
How much overhead does SSL impose?
HTTP vs HTTPS performance

(讨论为什么在登录后关闭SSL是一个坏主意)
http://codebutler.com/firesheep
http://codebutler.com/firesheep-a-week-later-idiot-shepherds
http://codebutler.com/firesheep-three-weeks-later-fallout

(堆栈溢出会影响其安全性 - 或者缺乏安全性) https://meta.stackexchange.com/questions/69171/why-doesnt-the-stack-overflow-team-fix-the-firesheep-style-cookie-theft

所有这些都说,有一些特殊情况应该加以考虑。也就是说,如果攻击者拦截并冒充您网站上的用户,可能会发生什么样的挫折?如果零或接近零负面因素,那么关闭ssl 可能没问题。即便如此,如果不这样做的成本超过我的承受能力,我只考虑走这条路。

答案 1 :(得分:0)

Matt Sollars创建的模块允许您使用web.config指定哪些页面需要SSL而哪些页面不需要SSL,而不是在代码中执行此操作。图书馆,文章和代码可在http://www.codeproject.com/KB/web-security/WebPageSecurity_v2.aspx获得。

答案 2 :(得分:0)

您可能需要查看HttpModule课程。通过这些操作,您可以拦截请求,并且有人done something按照您要执行的操作进行操作。

答案 3 :(得分:0)

到目前为止尚未解决的另一个方面是对SEO的影响。如果您有两个版本的网页以http和https格式链接,那么这可能会导致Google中出现重复的内容问题。在这种情况下,您应该使用301重定向到页面的相应协议版本。因此,如果您的登录页面为https://mysite/login,那么如果您在http://mysite/login上访问https版本,则应该执行301重定向。同样,如果您从安全网址链接回您网站的主页,则应使用主页网址的非安全版本,因为这最有可能在搜索引擎中编入索引。如果这是不可能的,那么您可以在页面中使用规范标签告诉搜索引擎页面的首选格式是http或https - 这比301重定向的效率低,但总比没有好。

有关详细信息,请参阅此链接:http://www.mattcutts.com/blog/seo-advice-url-canonicalization/