Selenium处理Azure SSO身份认证绕过相关问题咨询
核心问题原因
1. 令牌类型不匹配
你当前调用https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token接口用的是客户端凭据流,仅传入clientId、clientSecret、grant_type=client_credentials拿到的access_token是应用本身的服务身份凭证,仅用于服务到服务的接口调用,和用户身份的登录态完全无关,自然无法通过应用的用户身份校验。
2. 令牌注入逻辑错误
Azure AD 集成的应用不会直接把 Azure 返回的access_token作为Cookie存储:
- 后端渲染的Web应用,通常会在Azure登录回调完成后,生成应用自身的会话Cookie(比如
.AspNetCore.Cookies),用于后续的身份校验 - 前端SPA应用,通常会把
id_token、access_token存在localStorage/sessionStorage中,而非Cookie里
你直接把access_token写入Cookie的操作完全不符合应用的会话存储逻辑,自然不会生效。
3. 用户名密码获取令牌的API存在但有使用限制
你要找的传入用户名密码获取令牌的接口是资源所有者密码凭据流(ROPC),接口地址和你用的一致,仅需要调整请求参数即可,但该流微软不推荐生产使用,仅可用于测试场景,且不支持开启多因素认证的账号、个人微软账号,仅可用于同租户的工作/学校账号。
ROPC流的请求参数示例:
{ "client_id": "你的应用客户端ID", "client_secret": "你的应用客户端密钥(公开客户端可省略)", "grant_type": "password", "username": "测试用户账号", "password": "测试用户密码", "scope": "openid profile 你的应用API权限 offline_access" }
该请求会返回id_token、access_token、refresh_token三个核心凭证。
解决方案
方案1:API拿凭证后注入会话(适配需要批量跑不同用户测试的场景)
- 用上述ROPC流拿到对应的
id_token或授权码 - 适配你的应用会话逻辑完成注入:
- 后端Web应用:模拟Azure AD回调流程,将授权码发送到你的应用的回调接口,拿到应用返回的会话Cookie后写入浏览器
- 前端SPA应用:将返回的
id_token、access_token、过期时间等参数写入对应localStorage/sessionStorage的指定字段
- 刷新页面后登录态即可生效,无需走跳转登录流程。
方案2:导出导入登录上下文(更稳定,推荐UI自动化使用)
不需要调用任何Azure AD接口,直接通过自动化工具的上下文导出功能实现免登录:
- 首次运行自动化时,手动/自动完成一次完整的微软登录流程
- 导出当前浏览器的完整上下文(包含所有Cookie、本地存储、会话存储)存为状态文件
- 后续所有测试用例启动时直接加载该状态文件,启动后直接是已登录状态,完全跳过登录跳转流程。
Playwright自带storageState功能直接支持该操作,Selenium等工具也可以自行实现Cookie和存储的导出导入逻辑。
内容的提问来源于stack exchange,提问作者Rafael Nicola
相关产品推荐
相关产品推荐

