使用 Playwright 防止 SSO

Prevent SSO with Playwright

正在尝试为使用 ADFS 联合身份验证的网站编写自动化测试。

在我的 Ci/CD 管道中,我不会 运行 在经过身份验证的 Windows 上下文中,因此我的 Playwright 测试会遇到 ADFS 凭据提示,但是在开发我们正在工作的测试时在经过身份验证的上下文中,Windows 传递身份验证将启动(我猜是 NTLM)。

我该如何预防?

在我之前使用 NightwatchJS 编写的一组测试中,我使用的技巧是发送一个浏览器的自定义 UserAgent 字符串,该浏览器未在 ADFS 中注册为支持 NTLM 质询流的浏览器。 (顺便说一句,它是 Opera Mini)

对于 Playwright,同样的技巧显然不起作用,我希望那里有更好的东西。

我尝试了什么:

context = await browser.newContext({
        userAgent: 'Opera/9.80 (Android; Opera Mini/12.0.1987/37.7327; U; pl) Presto/2.12.423 Version/12.16'
})

您需要将调用发送到 Web 应用程序代理或设置一个内部代理。 Wep 应用程序代理不支持 Windows 集成身份验证。

所以.....经过更多的挖掘,在提出正确的问题之后,最终是:

“如何在 Chrome 中禁用 Windows 集成身份验证?”

我找到了 this checklist for conditions and

解决方法是向 chromium 添加启动参数以禁用 WIA。下面是重要的一点:

browser = await chromium.launch({
            args: ['--auth-server-whitelist="_"'],
        });

这将使 chrome 显示基本的凭据身份验证提示。

但是,当我将其与不在 ADFS 服务器支持的用户代理中的自定义 userAgent 字符串结合使用时,我设法到达了 ADFS 的登录页面。

OperaMini 再次为我工作:

context = await browser.newContext({
        userAgent: 'Opera/9.80 (Android; Opera Mini/12.0.1987/37.7327; U; pl) Presto/2.12.423 Version/12.16'
})