为啥 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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?