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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:20:25