在HTTPS请求中,Request.IsSecureConnection返回false

Jom*_*ohn 20 c# asp.net ssl https

我有一个使用https(SSL)的asp.net应用程序.这在我的本地计算机和Amazon AWS(生产环境)中运行良好.

但是当我在办公室托管这个应用程序(用于测试)时,会发生一些奇怪的事情

  1. 我可以在浏览器中看到https和锁定标志.

  2. Fiddler还显示输出已加密并显示端口443.

  3. 但是HttpContext.Current.Request.IsSecureConnection返回错误

  4. HttpContext.Current.Request.Url.Scheme返回http.

在办公室,我们使用的是Juniper SSG防火墙和TMG 2010(Forefront Threat Management Gateway 2010).因此服务器通过Juniper和TMG 2010接收请求.提前感谢.

Dar*_*rov 17

为了降低成本,我怀疑在TMG网关上安装了SSL证书,并且该网关在将请求传递给实际的Web服务器时只是将请求重写为标准HTTP.因此,当请求到达IIS和您的Web应用程序时,它是标准的纯HTTP请求.

  • @JomyJohn如果SSL*在TMG终止*,那么ASP.NET是正确的:获取ASP.NET的请求不是https (5认同)

she*_*tie 14

在部署到Amazon的Elastic Beanstalk环境之后,这让我失望了.我看不出任何方法让负载均衡器允许SSL请求直接进入服务器.相反,它总是在负载均衡器处终止SSL并将普通的http传递回服务器.

我找到了这个文档:Elastic Load Balancing Concepts - X-Forwarded Headers.

本质上,负载均衡器会在将每个请求转发到后端服务器之前为每个请求注入大量额外的HTTP标头.最相关的是X-Forwarded-Proto跟踪用于从客户端浏览器连接到负载均衡器的协议.可以像这样检查:

var loadbalancerReceivedSSLRequest = string.Equals(Request.Headers["X-Forwarded-Proto"], "https");
var serverReceivedSSLRequest = Request.IsSecureConnection;

if (loadbalancerReceivedSSLRequest || serverReceivedSSLRequest)
{
    // SSL in use.
}
else
{
    // SSL not in use.
}
Run Code Online (Sandbox Code Playgroud)