Azure Web 应用 + Node.js + Azure AD = 错误 431
Azure Web App + Node.js + Azure AD = Error 431
我在 Azure Web 应用程序中创建了一个基于 Node.js 的 Web 应用程序,运行,我想将其置于 Azure Active Directory 身份验证之后。激活 "App Service Authentication" 后,登录过程正常,但是在返回到我的应用程序时,它只是 returns 一个 HTTP 431 "Request Header Fields Too Large"。
为了验证它不是我的应用程序,我检查了 Azure Web 应用程序示例 Node.js,甚至这个 returns 在激活 AAD 时也是 431。
重现步骤:
- 创建新的 Azure 资源 -> Web 应用程序
- Select 任何基于 Node 的运行时堆栈,例如 Node 12 LTS
- Select 任意 OS
- 创建 Web 应用程序并等待部署完成
- 创建一个简单的网络应用程序
- 示例:https://github.com/Azure-Samples/app-service-web-nodejs-get-started
- 在网络服务上部署
- 到目前为止的结果:应用程序运行正常。
- 在网络应用程序设置中,转到 "Authentication / Authorization"
- 将"App Service Authentication"转为"On"
- Select Azure 活动目录
- Select 快速管理模式并在此过程中创建新的 Azure AD 应用程序
- 作为"Action to take when request is not authenticated" select "Log in with Azure AD"
- 确认
结果:使用浏览器打开 Web 应用程序 URL 时,它将显示登录过程,按照该过程似乎一切正常,AAD returns 到应用程序,但是那时它 returns 一个 HTTP 431。
进一步测试:
- 停用身份验证,一切正常
- 上传一个简单的 .html 文件而不是 Node 应用程序,在启用身份验证的情况下工作正常
- 已通过 restify 和 http
测试
有什么想法吗?我错过了什么吗?
这是一个已知问题,因为使用 8KB 硬上限 headers 的较新版本节点存在限制。 EasyAuth 向请求添加了一些非常大的 headers,这可能会导致节点容器拒绝中间件容器发出的带有 400 的请求。在此处阅读更多相关信息:
这可以通过将应用程序设置 WEBSITE_AUTH_DISABLE_IDENTITY_FLOW 设置为 true 来缓解。这将删除我们添加到请求中的最大 header 之一。此 header 通常仅由 .NET Framework 和 Azure Functions 应用程序使用,因此此设置应该是安全的。
如果问题仍然存在,您可以尝试使用 NodeJS 12 版本或增加 header 大小参数:node server.js --max-http-header-size 81000
我在 Azure Web 应用程序中创建了一个基于 Node.js 的 Web 应用程序,运行,我想将其置于 Azure Active Directory 身份验证之后。激活 "App Service Authentication" 后,登录过程正常,但是在返回到我的应用程序时,它只是 returns 一个 HTTP 431 "Request Header Fields Too Large"。
为了验证它不是我的应用程序,我检查了 Azure Web 应用程序示例 Node.js,甚至这个 returns 在激活 AAD 时也是 431。
重现步骤:
- 创建新的 Azure 资源 -> Web 应用程序
- Select 任何基于 Node 的运行时堆栈,例如 Node 12 LTS
- Select 任意 OS
- 创建 Web 应用程序并等待部署完成
- 创建一个简单的网络应用程序
- 示例:https://github.com/Azure-Samples/app-service-web-nodejs-get-started
- 在网络服务上部署
- 到目前为止的结果:应用程序运行正常。
- 在网络应用程序设置中,转到 "Authentication / Authorization"
- 将"App Service Authentication"转为"On"
- Select Azure 活动目录
- Select 快速管理模式并在此过程中创建新的 Azure AD 应用程序
- 作为"Action to take when request is not authenticated" select "Log in with Azure AD"
- 确认
结果:使用浏览器打开 Web 应用程序 URL 时,它将显示登录过程,按照该过程似乎一切正常,AAD returns 到应用程序,但是那时它 returns 一个 HTTP 431。
进一步测试:
- 停用身份验证,一切正常
- 上传一个简单的 .html 文件而不是 Node 应用程序,在启用身份验证的情况下工作正常
- 已通过 restify 和 http 测试
有什么想法吗?我错过了什么吗?
这是一个已知问题,因为使用 8KB 硬上限 headers 的较新版本节点存在限制。 EasyAuth 向请求添加了一些非常大的 headers,这可能会导致节点容器拒绝中间件容器发出的带有 400 的请求。在此处阅读更多相关信息: 这可以通过将应用程序设置 WEBSITE_AUTH_DISABLE_IDENTITY_FLOW 设置为 true 来缓解。这将删除我们添加到请求中的最大 header 之一。此 header 通常仅由 .NET Framework 和 Azure Functions 应用程序使用,因此此设置应该是安全的。
如果问题仍然存在,您可以尝试使用 NodeJS 12 版本或增加 header 大小参数:node server.js --max-http-header-size 81000