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

时间:2016-07-21 10:23:11

标签: c# asp.net azure ssl https

context.Request.IsSecureConnection

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

X-Forwarded-Proto=https

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

2 个答案:

答案 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 App Service Application Request Routing

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的选项