如果桌面或移动应用程序运行在 Windows 上,并且运行所在的计算机已连接到 Windows 域(已加入 Active Directory 或 Microsoft Entra),则可以使用集成 Windows 身份验证(IWA)以静默方式获取令牌。 使用应用程序时无需 UI。
final String AUTHORITY;
final String APP_ID;
String userName;
List<String> scopes;
PublicClientApplication app = PublicClientApplication.builder(APP_ID)
.authority(AUTHORITY)
.build();
IntegratedWindowsAuthenticationParameters parameters =
IntegratedWindowsAuthenticationParameters.builder(scope, userName).build();
IAuthenticationResult future = app.acquireToken(parameters).get();
限制条件
- 仅限联合身份验证* 用户,即身份验证由本地标识提供方(例如 ADFS)进行联合,或启用了无缝 SSO 的混合场景。 纯云租户(用户直接位于Microsoft Entra ID中,没有任何Active Directory支持)不能使用此流。
- IWA 不会绕过 MFA(多重身份验证)。 如果已配置 MFA,则在需要 MFA 质询的情况下,IWA 可能失败,因为 MFA 需要用户交互。
这是棘手的。 IWA 是非交互式的,但 2FA 需要用户交互。 你无法控制身份提供程序何时要求执行 2FA,租户管理员才可以。 根据我们的观察,在你从不同的国家/地区登录、未通过 VPN 连接到公司网络,以及有时甚至在通过 VPN 连接时,都需要进行 2FA 验证。 不要期望一组确定性规则,Microsoft Entra ID使用 AI 持续了解是否需要 2FA。 如果 IWA 失败,应退回到用户提示
传入
PublicApplication的授权方需要为:- 租户化的(形式为
https://login.microsoftonline.com/{tenant}/,其中tenant可以是表示租户 ID 的 GUID,也可以是与该租户关联的域名)。 - 适用于任何工作和学校账户(
https://login.microsoftonline.com/organizations/)
不支持 Microsoft 个人账户(不能使用 /common 或 /consumers 作为租户)
- 租户化的(形式为
由于集成Windows身份验证是无提示流:
- 应用程序的用户必须事先同意使用该应用程序
- 或租户管理员必须事先同意租户中的所有用户使用该应用程序。
- 这意味着:
- 要么是你作为开发者在 Azure 门户中为你自己点击了 授予 按钮,
- 或租户管理员已在该应用程序的注册页的 API 权限 选项卡中按下 为 {tenant domain} 授予/撤销管理员同意 按钮
- 或者你为用户提供了同意应用程序的方法
- 或者你已经为租户管理员提供了一种为该应用程序授予同意的方法