我尝试使用.NET Core's proxy library在Azure Web App后面设置Sonarqube。这可能听起来很奇怪但是由于Web Apps自动提供SSL证书而我无法获得自定义域名,我认为这个解决方案对我来说最简单;)
现在,在一些游戏工作得很好之后,该网站在浏览器中没有任何错误,可以使用Sonar登录或Azure Active Directory登录。
但是在我的构建过程中,无法将分析结果发布到服务器。响应总是401.
我检查了Sonarqube日志并找到了以下相应的条目:
在Web.log中
DEBUG web[...][auth.event] login failure [cause|Wrong CSFR in request][method|JWT][provider|LOCAL|local][IP|some ip|actual client ip:37390][login|admin]
:
some ip - - [...] "POST /api/ce/submit HTTP/1.1" 401 - "-" "Mozilla/5.0 ..." "..."
因此,我可以看到实际的声纳请求来自不同的IP,可能是因为网络设置或任何其他Azure魔法。
我无法弄清楚如何解决这个问题:D
我的反向代理解决方案非常简单。基本上我使用一个简单的空ASP.NET Core应用程序并在Startup.cs
中集成反向代理功能,如下所示:
app.RunProxy(new ProxyOptions
{
BackChannelMessageHandler = new HttpClientHandler
{
CheckCertificateRevocationList = false,
ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true,
AllowAutoRedirect = true,
AutomaticDecompression = DecompressionMethods.GZip,
CookieContainer = new CookieContainer
{
Capacity = int.MaxValue,
MaxCookieSize = int.MaxValue,
PerDomainCapacity = int.MaxValue
}
},
Scheme = serverConfiguration.Scheme,
Host = serverConfiguration.Host,
Port = serverConfiguration.Port,
});
我还添加了一些中间件来添加X_FORWARDED_PROTO
标头,然后检查X-Forwarded-For
标头是否配置正确。我还将Azure IIS配置为不通过web.config方式截断大型请求中的查询参数或内容。
我还试图伪造它并将X-Forwarded-For IP设置为IP,向Sonarqube发送实际请求但没有效果。
有谁知道如何解决这个问题? :)由于这只是一个POC设置,我很乐意关闭CSRF检查,但我找不到任何配置。任何帮助,将不胜感激。
编辑+当前解决方案
更多地考虑我的初始解决方案,问题变得非常清楚。我正在尝试使用Azure App Service's VNet Integration Feature连接到服务器。这在代理站点和实际服务器之间提供了安全的VPN连接。但它也导致IP与预期不同:
Client [Client IP] -> Web App Proxy [Proxy Public IP] -> VNet VPN [VPN IP of the Web App == some ip in the logs] -> Sonarqube => 401 CSRF error
我认为X-Fowarded-For
链在这种情况下是不正确的,我不知道如何解决这个问题。
现在,作为一种解决方法,我已向Sonarqube服务器添加了一个公共IP,并将网络安全组配置为仅允许来自Web App的流量(使用提供的Web App的传出IP地址)。有了这个解决方案,一切正常:)
我仍然想要促进VNet集成功能,所以如果有人有想法,请告诉我:))
答案 0 :(得分:1)
我已将此问题报告给Google群组作为错误:
“即使使用SSO,也会随机显示声纳本机登录表单”
https://groups.google.com/forum/#!msg/sonarqube/o2p2ZmjqRN8/UAZZF3tMBgAJ
我发现,apache为不同的用户重用一个连接。 User-A通过Apache-Sonar connection-1,然后Apache重新使用此连接用于其他用户-B的其他请求,然后在同一Apache-Sonar连接中的下一个请求用于来自用户-A的新请求。然后,此请求被分类为未授权,Sonar生成登录表单,尽管Apache请求包含带有SSO登录数据的标头。
今天,我已经激活了DEBUG日志并发现消息“请求中的CSFR错误”。它看起来非常像CSFR保护,但有一些bug,好像代码确实忽略用户名或类似的东西。
此致
罗伯特。