当网站位于提供TLS证书的负载均衡器后面时,将cookie标记为表单身份验证中的“安全”

时间:2011-11-29 07:03:13

标签: asp.net security cookies ssl load-balancing

最近我在AppHarbor上的网站遇到了一些问题,我在他们的支持论坛上写过:Request.IsSecureConnection always returns false

简而言之,由于负载均衡器在点击Web应用之前会对其进行解密,因此表单auth上的Request.IsSecureConnectionrequireSSL等配置的行为不符合预期。实际上在后一种情况下,您甚至无法进行身份验证,因为应用程序认为请求不是通过HTTPS传递的。

表单auth特别有问题,因为没有它,cookie不会设置为“安全”,如果网站仅通过域名访问并且隐式提供不安全的URL方案,则会通过HTTP发送回来。

最好的解决方法是什么?我更喜欢利用本机安全配置,任何人都可以看到一种方法来覆盖检查连接是否安全的实现?很容易检测到请求是通过HTTPS提供的(基于Request.Url.Scheme还是X_FORWARDED_FOR标题),这只是一个整齐地将其绑定的问题。

2 个答案:

答案 0 :(得分:5)

或者,您可以使用URL重写模块来诱骗ASP.NET认为它在HTTPS上下文中运行,并保留requireSSL标志(这意味着cookie将被设置为安全 - 并且仅在以下情况下可用:你真的在HTTPS下运行

您可以在web.config中设置以下内容:

    <rewrite>
        <rules>
            <rule name="HTTPS_AlwaysOn" patternSyntax="Wildcard">
                <match url="*" />
                <serverVariables>
                    <set name="HTTPS" value="on" />
                </serverVariables>
                <action type="None" />
            </rule>
        </rules>
    </rewrite>

您还需要将HTTPS添加到applicationHost.config中的allowedServerVariables列表中(或通过URL REwrite config)

        <rewrite>
            <allowedServerVariables>
                <add name="HTTPS" />
            </allowedServerVariables>
        </rewrite>

感谢ASP.NET团队的Levi Broderick,他向我发出了正确的解决方案!

答案 1 :(得分:4)

关闭RequireSSL设置并将以下代码添加到您的应用中。这应该保护您的身份验证/会话cookie。

void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.Cookies.Count > 0)
    {
        foreach (string s in Response.Cookies.AllKeys)
        {
            if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
            {
                Response.Cookies[s].Secure = true;
            }
        }
    }
}