基于Selenium C#实现带SSO双因素认证Web应用的CI自动化测试方案咨询
适配SSO+双因素认证的CI环境Selenium测试解决方案
以下是经过落地验证的可靠方案,可按照你的公司权限灵活选择:
- 方案1:申请测试专用SSO服务账号(最合规首选)
向公司IT/SSO管理员申请权限最小化的自动化测试专用服务账号,申请该账号的双因素认证豁免权限,同时限制该账号仅能从CI服务器IP段访问目标应用。将账号密码存储在CI系统的加密变量库中,测试脚本运行时动态读取密码完成SSO登录,全程不会硬编码或明文泄露密码。 - 方案2:通过SSO服务端授权流直接获取会话(最稳定推荐)
向SSO管理员申请开通OAuth2 Client Credentials(客户端凭证)授权权限,分配仅用于测试的Client ID和Client Secret,存储在CI加密变量中。测试启动时不需要走前端登录流程,直接调用SSO接口获取有效访问令牌,再将令牌注入浏览器的Cookie或LocalStorage中,即可直接进入登录后的应用状态。该方案完全规避双因素流程,令牌每次动态获取无有效期限制,兼容性最好。
对应C#代码示例如下:using System.Net.Http.Json; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; // 定义SSO令牌返回结构 public class TokenResult { public string AccessToken { get; set; } public int ExpiresIn { get; set; } } public async Task RunTest() { // 1. 提前从CI加密变量读取SSO Client配置,禁止硬编码 var ssoClientId = Environment.GetEnvironmentVariable("SSO_CLIENT_ID"); var ssoClientSecret = Environment.GetEnvironmentVariable("SSO_CLIENT_SECRET"); // 2. 调用SSO OAuth2 Client Credentials接口获取访问令牌 var httpClient = new HttpClient(); var tokenResponse = await httpClient.PostAsync("https://公司SSO域名/oauth2/token", new FormUrlEncodedContent(new Dictionary<string, string> { {"grant_type", "client_credentials"}, {"client_id", ssoClientId}, {"client_secret", ssoClientSecret}, {"scope", "目标应用的授权Scope"} })); tokenResponse.EnsureSuccessStatusCode(); var tokenContent = await tokenResponse.Content.ReadFromJsonAsync<TokenResult>(); // 3. 启动ChromeDriver var chroptions = new ChromeOptions(); chroptions.AddArguments("--noerrdialogs", "--no-sandbox"); chroptions.AddAdditionalCapability("useAutomationExtension", false); var driver = new ChromeDriver(chroptions); // 4. 先访问应用根域名下任意页面,确保Cookie/LocalStorage有权限写入 driver.Navigate().GoToUrl("https://目标应用域名/404"); // 5. 注入SSO会话凭证,根据你公司SSO的存储方式二选一即可 // 方式A:注入Cookie driver.Manage().Cookies.AddCookie(new Cookie("sso_access_token", tokenContent.AccessToken, "/", "目标应用域名")); // 方式B:写入LocalStorage ((IJavaScriptExecutor)driver).ExecuteScript($"localStorage.setItem('sso_access_token', '{tokenContent.AccessToken}');"); // 6. 访问应用实际业务页面,此时已处于登录状态,可直接执行后续测试逻辑 driver.Navigate().GoToUrl("https://目标应用域名/home"); } - 方案3:CI服务器持久化Chrome用户配置(无权限申请时的替代方案)
自己在CI服务器上手动启动Chrome,走一次完整的SSO+双因素认证流程,勾选SSO页面的「记住此设备/30天内无需二次验证」选项,关闭浏览器后将对应的Chrome用户配置文件夹加密,存储在CI的安全存储区域。每次测试运行前将加密的配置文件解密到临时目录,通过user-data-dir参数传给ChromeDriver即可直接复用已登录的会话,仅需要每隔20-30天手动更新一次配置文件即可,不需要存储账号密码。 - 方案4:反向代理注入会话凭证(极端场景备用)
如果无法申请SSO相关权限,可以在CI环境内部署一个反向代理服务,提前在代理层配置好有效的SSO会话凭证,测试脚本直接访问代理地址,代理会自动将凭证注入请求中,跳过登录流程。需要定期更新代理层存储的会话凭证即可。
内容的提问来源于stack exchange,提问作者Lionel Champalaune
相关产品推荐
相关产品推荐

