最近我在AppHarbor上的网站遇到了一些问题,我在他们的支持论坛上写过:Request.IsSecureConnection always returns false
简而言之,由于负载均衡器在点击Web应用之前会对其进行解密,因此表单auth上的Request.IsSecureConnection
和requireSSL
等配置的行为不符合预期。实际上在后一种情况下,您甚至无法进行身份验证,因为应用程序认为请求不是通过HTTPS传递的。
表单auth特别有问题,因为没有它,cookie不会设置为“安全”,如果网站仅通过域名访问并且隐式提供不安全的URL方案,则会通过HTTP发送回来。
最好的解决方法是什么?我更喜欢利用本机安全配置,任何人都可以看到一种方法来覆盖检查连接是否安全的实现?很容易检测到请求是通过HTTPS提供的(基于Request.Url.Scheme
还是X_FORWARDED_FOR
标题),这只是一个整齐地将其绑定的问题。
答案 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;
}
}
}
}