You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:24:03