如何在Azure DevOps流水线中访问Azure AD登录保护网站执行前端E2E测试?
针对Azure AD保护网站的E2E测试自动化登录方案
以下是几种在Azure DevOps流水线中实现无交互登录的最优方案,可解决MFA阻碍和令牌不识别的问题:
方案1:使用Azure AD服务主体无交互登录
这是自动化场景下最推荐的方案,服务主体无需MFA,权限可控性强:
- 在Azure AD中注册一个服务主体,为其分配目标网站的访问权限(比如在目标网站的Azure AD应用注册中添加对应应用角色,或在App Service的身份验证设置中允许该服务主体登录)。
- 在Azure DevOps流水线中,通过Azure CLI获取针对目标网站的访问令牌:
az account get-access-token --resource <目标网站的Azure AD应用ID> - 将获取到的令牌注入E2E测试工具(如Cypress、Playwright),通过设置请求头
Authorization: Bearer <token>直接访问受保护页面,或模拟前端应用的登录状态(将令牌存入localStorage/sessionStorage)。 - 注意:确保目标网站的Azure AD认证配置允许服务主体登录,且未对该主体强制MFA。
方案2:创建豁免MFA的专用测试用户
如果需要模拟真实用户的操作流程,可采用此方案:
- 在Azure AD中创建专门的测试用户,分配目标网站的访问权限。
- 在Azure AD的条件访问策略中,为该测试用户(或流水线的固定IP范围)配置MFA豁免规则,避免登录时出现验证码。
- 在Azure DevOps的安全库中存储测试用户的用户名和密码,在E2E测试脚本中自动填充登录表单,完成无交互登录。
方案3:使用ROPC流获取令牌(仅适用于测试环境)
ROPC流允许直接通过用户名密码获取令牌,无需交互,但微软不推荐用于生产环境:
- 在目标网站的Azure AD应用注册中,启用Resource Owner Password Credentials流(在「身份验证」→「高级设置」中开启)。
- 在流水线中发送POST请求获取令牌:
POST https://login.microsoftonline.com/<租户ID>/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=<你的应用ID>&client_secret=<应用密钥>&username=<测试用户名>&password=<测试密码>&grant_type=password&scope=<目标网站的scope> - 将返回的
access_token用于E2E测试的身份验证,比如注入请求头或前端存储。
解决令牌不被识别的常见问题
你之前遇到的令牌无效问题,通常是以下原因导致:
- 令牌的资源ID/scope不匹配:确保获取令牌时指定的
resource或scope是目标网站的Azure AD应用ID,而非其他资源(如Azure Management API)。 - 目标网站的认证配置未允许对应的主体:检查服务主体或测试用户是否被添加到目标应用的允许登录列表,或是否拥有对应的访问权限。
- 令牌已过期:确保在测试前实时获取令牌,而非使用缓存的过期令牌。
内容的提问来源于stack exchange,提问作者nicolattu
相关产品推荐
相关产品推荐

