当前请求是通过使用Azure部署的SSL进行的

context.Request.IsSecureConnection 

即使通过HTTPS提供连接,始终在Azure部署中返回false。 在查看为Azure部署的站点发送的标头后,我发现:

 X-Forwarded-Proto=https 

此标头是否保证与网站的客户端连接在HTTPS下,与context.Request.IsSecureConnection连接方式相同?

重要的提示:

.NET Framework 4.7和ASP.NET Core 2.0上的ASP.NET不再需要我的答案中提到的自定义检查。

如果请求源自Azure App Service中的HTTPS,则HttpContext.Request.IsHttps (Core)和HttpContext.Request.IsSecureConnection都将返回True

这就是我测试过的,它可能在这些堆栈的生命周期中发生得更早(例如.NET Framework 4.6.x)。 您应该没问题,因为App Service现在可以在.NET Framework 4.7之上运行您的应用程序。

您最有可能必须检查任何其他编程堆栈。


我不是在问如何强制使用HTTPS,我问为什么Azure部署中的context.Request.IsSecureConnection即使请求是通过HTTPS也返回false

原因如下:

Azure应用服务应用请求路由

Azure应用服务前端层终止 TLS通道(也称为TLS卸载)并打开与您的代码所在的Web Worker的新的纯HTTP连接。 路由由ARR (应用请求路由)执行。

资源:
https://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/AZR305
(查看幻灯片,幻灯片12)

因此,从您的代码的角度来看,每一个请求都是“不安全的”。

X-Forwarded-Proto=https关于原始请求的提示(触及前端)。

如果必须进行检查,请改为使用X-ARR-SSL

ARR将特殊请求标头附加到通过HTTPS到达的每个请求。 X-ARR-SSL包含的值提供有关用于保护客户端(即浏览器)和ARR前端之间的TCP连接的TLS服务器证书的信息。

例如:

 X-ARR-SSL: 2048|256|C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Microsoft IT, CN=Microsoft IT SSL SHA2|CN=*.azurewebsites.net 

这里有更多信息:
https://tomasz.janczuk.org/2013/12/secure-by-default-with-ssl-in-windows.html

Tomasz是iisnode项目的作者,该项目是在Azure App Service中在IIS上运行Node应用程序的机制。

执行摘要

App Service使用应用程序请求路由,这也是TLS终止的点。 由于访问您的Web工作者的流量将是纯HTTP,您需要检查此标头以告知请求是否源自TLS:

 if (request.headers['x-arr-ssl']) { // We're good } else { // Request made over plain HTTP } 

如果您在.NET Framework 4.7或.NET Core 2.0上运行,则无需进行此检查,在逻辑中将为HttpContext.Request.IsSecureConnectionHttpContext.Request.IsHttps (.NET Core)返回正确的值。 )。

不确定这是否对您有所帮助。

2选项。

第一个选项:ASP.NET MVC RequireHttps属性,可用于装饰控制器或特定操作。 到目前为止,这是强制进行HTTPS重定向的最简单方法。

 [RequireHttps] public ActionResult Secure() { return View(); } 

第二个选项URL重写

                 

以上是您100%确认的选项,以确保请求是HTTPS