使用Selenium处理SAML认证302重定向时的凭证传递问题
解决Selenium处理SAML重定向时的身份认证问题
方案1:配置浏览器启动参数,直接支持重定向时的凭证传递
你之前把凭证拼在初始访问的home.domain.comURL上是无效的,实际需要认证的是重定向后的auth.domain.com域,按以下配置即可:
- Chrome浏览器启动时添加如下参数(其他浏览器可查询对应配置项,逻辑一致):
配置完成后直接访问// 以Java代码为例,其他语言对应修改启动参数即可 ChromeOptions options = new ChromeOptions(); // 白名单需要认证的ADFS域名,允许自动传递凭证 options.addArguments("--auth-server-whitelist=auth.domain.com"); // 预置认证账号密码,不需要弹窗输入 options.addArguments("--auth-basic-username=admin"); options.addArguments("--auth-basic-password=passw0rd"); // 禁用URL内嵌凭证的安全警告 options.addArguments("--disable-blink-features=BlockCredentialedSubresources");home.domain.com/run.jsp即可,重定向到ADFS页时浏览器会自动传递预置的凭证,不需要手动处理弹窗。
方案2:Selenium 4+ DevTools API注入认证凭证(兼容性更强)
如果浏览器版本不支持上述启动参数,可以用DevTools的Network.setExtraHTTPHeaders方法提前注入Authorization头,适配所有重定向请求:
- 核心代码示例:
这种方式不需要修改URL,所有重定向到认证域的请求都会自动带上认证信息,不会触发安全警告。DevTools devTools = driver.getDevTools(); devTools.createSession(); // 开启Network域监听 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 构造Basic Auth的头信息 String auth = "admin:passw0rd"; String base64Auth = Base64.getEncoder().encodeToString(auth.getBytes()); // 给所有请求自动加认证头,重定向时也会生效 devTools.send(Network.setExtraHTTPHeaders(Headers.of( "Authorization", "Basic " + base64Auth )));
方案3:提前获取SAML断言跳过重定向流程
如果以上方案都有适配问题,可以直接调用ADFS的接口提前获取SAML断言,生成有效Cookie后直接注入Selenium的浏览器实例,不需要走重定向流程:
- 用后台HTTP客户端构造请求向
auth.domain.com/adfs/ls/wia提交认证凭证,拿到返回的SAMLResponse参数 - 在Selenium中先访问一次
home.domain.com的任意路径,把有效认证Cookie、Session全部注入 - 直接访问
home.domain.com/run.jsp即可,不会触发重定向认证。
注意:如果你的ADFS配置了多因子认证,需要对应调整凭证提交的参数,上述方案默认仅适配账号密码的单因子认证场景。
内容的提问来源于stack exchange,提问作者Jeremy Meadows
相关产品推荐
相关产品推荐

