Azure Web App + Node.js + Azure AD = 错误 431

11
我创建了一个基于Node.js的Web应用程序,运行在Azure Web应用程序中,我希望将其置于Azure Active Directory身份验证后面。激活“应用程序服务身份验证”后,登录过程正常工作,但是返回我的应用程序时,它只返回HTTP 431“请求头字段太大”。
为了验证不是我的应用程序的问题,我检查了Node.js的Azure Web应用程序示例,即使在激活AAD时,这个示例也会返回431。
重现步骤:
1. 创建新的Azure资源->Web应用程序 - 选择任何基于Node的运行时堆栈,例如Node 12 LTS - 选择任何操作系统 - 创建Web应用程序并等待部署完成
2. 创建一个简单的Web应用程序 - 示例:https://github.com/Azure-Samples/app-service-web-nodejs-get-started - 在Web服务上部署 - 到目前为止的结果:应用程序可以正常工作。
3. 在Web应用程序设置中,转到“身份验证/授权” - 将“应用程序服务身份验证”打开 - 选择Azure Active Directory - 选择Express管理模式,并在此过程中创建新的Azure AD应用程序 - 当请求未经身份验证时采取的操作选择“使用Azure AD登录” - 确认
结果:在使用浏览器打开Web应用程序URL时,它将显示登录过程,按照流程进行,一切似乎都正常工作,AAD返回应用程序,但此时它返回HTTP 431。
进一步测试: - 停用身份验证,一切正常 - 上传一个简单的.html文件而不是Node应用程序,在启用身份验证的情况下可以正常工作 - 使用restify和http进行测试
有什么想法吗?我错过了什么吗?
1个回答

16

由于较新版本的node对于头文件的限制达到了8KB的硬性上限,这是一个已知问题。EasyAuth在请求中添加了一些非常大的头文件,这可能导致节点容器拒绝被中间件容器发出的请求并返回400错误。在此处阅读更多信息:

您可以通过将应用设置WEBSITE_AUTH_DISABLE_IDENTITY_FLOW设置为true来缓解此问题。这将删除我们添加到请求中的最大头文件之一。此标题通常仅由.NET Framework和Azure Functions应用程序使用,因此此设置应该是安全的。

如果问题仍然存在,您可以尝试使用NodeJS 12版本或增加头文件大小参数:node server.js --max-http-header-size 81000


1
嗨Bryan,感谢你的回答!那似乎就是问题所在。我会尝试你的设置并回报结果。请问你能否添加你提到的链接吗?有趣的是,在西欧位置服务器上没有出现这个问题,只有在美国的服务器上才有。我们是否对它们使用不同(大小)的标头? - Dirk Songür
2
将 "WEBSITE_AUTH_DISABLE_IDENTITY_FLOW" = "true" 添加到 Configuration -> Application Settings 中即可解决问题 - 非常感谢! - Dirk Songür
Dirk,我很高兴这能帮到你。我忘记添加超链接的URL在这里:https://github.com/nodejs/node/issues/24693 - Bryan Trach-MSFT
对我来说,简单地切换到NodeJS v14似乎解决了问题。我不确定这是由于NodeJS v14的更改还是Azure App Service中NodeJS v14的设置。 - pcnate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接