通过HttpCredentials使用Windows身份验证凭据时不起作用

前端开发 2026-07-09

以下内容,使用Microsoft.Playwright.Xunit NuGet包:

public class Testing: PlaywrightTest
{
    [Fact]
    public async Task Visit()
    {
        var browser = await Playwright.Chromium.LaunchAsync(
            new BrowserTypeLaunchOptions { Headless = false });

        var context = await browser.NewContextAsync(
            new BrowserNewContextOptions 
            { 
                HttpCredentials = 
                new HttpCredentials { Username = "username", Password = "pass" }
            }
        );

        var page = await context.NewPageAsync();
        await page.GotoAsync("https://url.com/");
    }
}

传递的凭据是一个测试Windows用户的凭据。该站点使用Windows身份验证。一旦请求进入网站的控制器动作中的.NET代码,IHttpContextAccessor.HttpContext.User 对象就清楚地显示当前正在笔记本上运行测试的用户是谁。

Playwright JS的等效代码达到了预期效果,网站认为用户即匹配所提供的凭据:

    const context = await browser.newContext({
      httpCredentials: {
        username: "username",
        password: "password",
      },
    });

    const page = await context.newPage();

...但没有人愿意使用Playwright JS。

为什么Playwright.NET无法在浏览器上使用 HttpCredentials 对象,而在完全等效的Playwright JS代码工作?

解决方案

简短版本

使用此方法可以防止Chromium使用当前Windows帐户自动进行身份验证:

new BrowserNewContextOptions 
{ 
    Args=new string[] { """--auth-server-allowlist="_" """ }
    HttpCredentials = new HttpCredentials { Username = "username", Password = "pass" }
}

三引号用于定义一个原始字符串字面量,省去了转义。

看起来要么JS代码没有在Windows上运行,要么在设置HttpCredentials时,JS API代码显式地把 --auth-server-allowlist="_" 设置起来以禁用自动登录。API之下,Playwright本身是一个JavaScript工具。


首先,Playwright是一个Node.js工具。Playwright的 .NET、Python、Java版本都是对该工具的封装。归根结底,一切都使用Node.js版本的Playwright。不过这些包装库并不暴露所有Node的特性,文档也可能不如全面。例如,.NET的 [Authentication] 页面要比 [Node.js页面] 小很多。像 [Visual Comparisons] 这样的完整功能,只有在Node.js库中才可用。

另一方面,你可以在所有库之间共享身份验证状态,因为归根结底,它们使用的是同一个工具。

其次,Windows身份验证在客户端(应用程序、浏览器)和服务器之间工作。不会交换凭据。浏览器和站点协商,操作系统提供的令牌被发送给服务器。只有客户端和服务器在同一域时才会生效。是否自动完成取决于用户的Internet设置。通常,只有用户的受信任站点或内网站点才使用自动登录。在其他情况下,浏览器会要求输入用户名和密码。即使如此,密码也从不发送给浏览器。

无论以何种方式启动应用程序(包括Chromium),它都以当前用户的账户运行。要在不同账户下运行,唯一的方法是使用Windows impersonation(Windows身份伪装),本身需要提升的权限。本质上,就是调用 "LoginUser" 来获取令牌,然后用该令牌来执行代码。

Chromium允许你通过 --auth-server-allowlist 开关指定自己的允许站点列表,或完全禁用自动登录。没有官方的开关清单,但 [这个站点] 是一个半官方的当前开关列表。

你可以通过添加 --auth-server-allowlist="_" 开关来禁用自动登录。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章