Java-Selenium中能否绕过Microsoft Authenticator验证?能否使用MSAL?
解决Microsoft Authenticator验证的Java-Selenium登录问题
关于绕过移动端MFA验证的可能性
直接绕过Microsoft Authenticator的多因素验证(MFA)并非通用方案,因为这是Azure AD的核心安全机制,但可以通过测试环境配置实现类似效果:
- 申请测试账号MFA豁免:联系Azure AD管理员,为用于自动化测试的账号关闭MFA,或配置信任IP范围,让测试机器的IP处于信任列表中,自动跳过MFA步骤。
- 注意:生产环境绝对不允许绕过MFA,仅适用于内部测试场景。
使用MSAL Java实现无交互登录(替代Selenium模拟)
MSAL(Microsoft Authentication Library)可以直接获取身份令牌,再将令牌注入Selenium会话,跳过手动登录和MFA环节,这是更可靠的自动化登录方案,具体步骤如下:
1. 准备Azure AD应用注册
- 在Azure门户注册一个应用,根据测试场景选择:
- 若使用测试用户账号,设置为公共客户端;
- 若使用服务账号(无用户交互),设置为机密客户端。
- 为应用添加目标API的权限(比如你的业务应用所需的权限),并完成管理员同意(若权限需要)。
2. 引入MSAL Java依赖
在Maven项目中添加依赖:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.14.0</version> <!-- 建议使用最新稳定版 --> </dependency>
3. MSAL获取令牌示例代码
公共客户端模式(测试用户账号,用户名密码流)
仅适用于已豁免MFA的测试账号:
import com.microsoft.aad.msal4j.*; import java.util.Collections; import java.util.concurrent.CompletableFuture; public class MsalUserTokenProvider { private static final String CLIENT_ID = "你的Azure应用客户端ID"; private static final String TENANT_ID = "你的租户ID"; private static final String TEST_USER = "测试账号用户名"; private static final String TEST_PWD = "测试账号密码"; private static final String TARGET_SCOPE = "api://你的业务应用ID/access_as_user"; // 替换为实际scope public static String getAccessToken() throws Exception { PublicClientApplication pca = PublicClientApplication.builder(CLIENT_ID) .authority("https://login.microsoftonline.com/" + TENANT_ID) .build(); UserNamePasswordParameters params = UserNamePasswordParameters.builder( Collections.singleton(TARGET_SCOPE), TEST_USER, TEST_PWD.toCharArray()) .build(); IAuthenticationResult result = pca.acquireToken(params).get(); return result.accessToken(); } }
机密客户端模式(服务账号,无用户交互)
适合无需用户参与的自动化场景,完全跳过MFA:
import com.microsoft.aad.msal4j.*; import java.util.Collections; import java.util.concurrent.CompletableFuture; public class MsalServiceTokenProvider { private static final String CLIENT_ID = "你的Azure应用客户端ID"; private static final String CLIENT_SECRET = "你的Azure应用客户端密钥"; private static final String TENANT_ID = "你的租户ID"; private static final String TARGET_SCOPE = "api://你的业务应用ID/.default"; // 客户端凭据流固定用.default public static String getAccessToken() throws Exception { ConfidentialClientApplication cca = ConfidentialClientApplication.builder( CLIENT_ID, ClientCredentialFactory.createFromSecret(CLIENT_SECRET)) .authority("https://login.microsoftonline.com/" + TENANT_ID) .build(); ClientCredentialParameters params = ClientCredentialParameters.builder( Collections.singleton(TARGET_SCOPE)) .build(); IAuthenticationResult result = cca.acquireToken(params).get(); return result.accessToken(); } }
4. 将令牌注入Selenium会话
获取令牌后,通过Selenium的JS执行能力,将令牌存入浏览器的localStorage或sessionStorage(需匹配你的业务应用的令牌存储逻辑),再刷新页面即可自动登录:
import org.openqa.selenium.chrome.ChromeDriver; public class SeleniumAutoLogin { public static void main(String[] args) throws Exception { ChromeDriver driver = new ChromeDriver(); driver.get("你的业务应用首页URL"); // 获取MSAL生成的访问令牌 String accessToken = MsalUserTokenProvider.getAccessToken(); // 将令牌注入浏览器存储(根据应用实际存储key调整) driver.executeScript("localStorage.setItem('access_token', arguments[0]);", accessToken); // 刷新页面,应用会读取令牌并自动完成登录 driver.navigate().refresh(); } }
关键注意事项
- 用户名密码流仅适用于测试场景,生产环境禁止使用。
- 若必须使用带MFA的账号,MSAL支持设备码流,但仍需手动批准,仅适合半自动化场景,不如豁免MFA的测试账号高效。
- 确保你的业务应用支持通过本地存储的令牌静默登录,而非强制跳转至Microsoft登录页。
内容的提问来源于stack exchange,提问作者Ajeesh
相关产品推荐
相关产品推荐

