为啥 Request.IsSecureConnection 在预期为 true 时返回 false
Posted
技术标签:
【中文标题】为啥 Request.IsSecureConnection 在预期为 true 时返回 false【英文标题】:Why does Request.IsSecureConnection return false when true is expected为什么 Request.IsSecureConnection 在预期为 true 时返回 false 【发布时间】:2010-11-03 03:50:33 【问题描述】:我有一个 aspx 页面,它正在检查 Request.IsSecureConnection 以确保它是真的,如果不是,它会重定向到 https://www.domain.com/page.aspx 的安全页面。
服务器为域安装了 SSL 证书,浏览器显示挂锁图标。
相同的代码在不同的服务器上运行良好,但现在 Request.IsSecureConnection 总是返回 false。
我创建了一个完全空的 aspx 文件,它只打印 Request.IsSecureConnection 的返回值,它仍然是 false,因此没有来自标准 http 请求的其他内容。
任何人都可以提出可能导致此问题的原因,或提供任何提示我如何找出导致此问题始终返回错误的原因?
【问题讨论】:
【参考方案1】:一些负载均衡器会在请求中添加一个新标头,您可以使用该标头来确定来自客户端的原始请求是否通过 SSL。对于 Azure 网站,以下代码似乎可以工作:
if (string.IsNullOrEmpty(Request.Headers["x-arr-ssl"]))
// No SSL
else
// Secure connection
其他一些负载均衡器可能会使用另一个标头,例如 X-Forwarded-Proto。
【讨论】:
【参考方案2】:如果您的网络服务器前面有一个负载平衡路由器或类似设备并带有 ssl 终止,那么从那里到您的网络服务器的连接将不会通过 SSL。在这种情况下,您通常必须检查特定端口上的连接或负载均衡器设置的标头。
【讨论】:
或者让负载均衡器来确保从客户端到您的网站的连接是安全的。 他应该能够通过在该测试页面上输出 Request.UserHostAddress 和/或 Request.UserHostName 来确认这种怀疑。如果这些值不是他正在连接的客户端(或客户端正在通过的代理),那么它们很可能会识别出某种负载均衡器或位于他的 Web 服务器前面的反向代理。 Request.UserHostAddress 和 Request.UserHostName 都返回我的 IP 地址。以上是关于为啥 Request.IsSecureConnection 在预期为 true 时返回 false的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?