context.Request.IsSecureConnection
在Azure部署中始终返回false,即使通过HTTPS提供连接也是如此。在查看为Azure部署的站点发送的标头后,我发现:
X-Forwarded-Proto=https
此标头是否保证客户端与HTTPS的连接方式与context.Request.IsSecureConnection
的方式相同?
答案 0 :(得分:3)
.NET Framework 4.7和ASP.NET Core 2.0上的ASP.NET不再需要我的答案中提到的自定义检查。
如果请求源自Azure App Service中的HTTPS,则HttpContext.Request.IsHttps
(核心)和HttpContext.Request.IsSecureConnection
都将返回True
。
这是我测试的内容,它可能在这些堆栈的生命周期中发生得更早(例如.NET Framework 4.6.x)。您应该没问题,因为App Service现在可以在.NET Framework 4.7之上运行您的应用程序。
你很可能必须检查任何其他编程堆栈。
我没有询问如何强制使用HTTPS,我问为什么在Azure部署中
context.Request.IsSecureConnection
即使请求是通过HTTPS返回false
。
这就是原因:
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服务器证书的信息。
e.g:
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.IsSecureConnection
并返回正确的值HttpContext.Request.IsHttps
(.NET Core)。
答案 1 :(得分:-2)
不确定这对您是否有帮助。
2选项。
第一个选项: ASP.NET MVC RequireHttps可用于装饰控制器或特定操作的属性。这是强制进行HTTPS重定向的最简单方法。
SQL> select sysdate as today, trunc(sysdate, 'q') - 1 as last_day_of_prev_qtr from dual;
TODAY LAST_DAY_OF_PREV_QTR
---------- --------------------
2016-08-02 2016-06-30
第二选择 URL重写
[RequireHttps]
public ActionResult Secure()
{
return View();
}
以上是您100%确认以确保请求为HTTPS的选项