在多租户场景下,MSAL Flutter(msal_auth 3.5.0)返回的是主租户ID,而不是客户端租户ID

移动开发 2026-07-08

我正在将 MSAL认证 集成到一个Flutter应用中,使用 msal_auth: ^3.5.0 插件,并搭配Flutter SDK 3.38.2。

  • 我有一个带有我所在组织域名的 Microsoft帐户
  • 同一账户已作为客户Azure AD租户中的 来宾用户 被添加。
  • 在客户的Azure门户中,应用注册被配置为 多租户(客户端ID和租户ID的设置,已启用“Accounts in any organizational directory”)。

之前能正常工作的情形

当应用配置为 单租户(指向我所在组织的租户ID,且在公司Azure账户中添加了客户端ID)时,一切都正常。来自MSAL的 ID令牌按预期包含我所在组织的租户ID。

现在的问题

在客户的Azure门户启用 多租户 后,MSAL返回的ID令牌仍然包含 我的组织租户ID,而不是 客户端的租户ID,尽管:

  • 我的账户在客户租户中具有来宾访问权限。
  • 应用注册设置为多租户。
  • 我正在使用以下配置:

msal_config.json文件

{
  "client_id": "AzureClientId",
  "redirect_uri": "msauth://mypackagename/SHA_Key",
  "broker_redirect_uri_registered": true,
  "account_mode": "MULTIPLE",
  "authorities": [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADMultipleOrgs"
      }
    }
  ]
}
///1. Initializes the MSAL authentication client.
Future<void> handleSSOSignInUser() async {
  try {
    final msalAuth = await _msalAuthCreate();
    // Acquire token (login)
    final authResult = await msalAuth.acquireToken(scopes: [SsoConfig.scope], prompt: Prompt.login);

    final idToken = authResult.idToken;

    if (idToken != null) {
      await _ssoLoginApiCall(idToken);
    }
  } on MsalClientException catch (e) {
    if (e.errorCode == 'current_account_mismatch') {
      final msalAuth = await _msalAuthCreate();
      await _removeAllMsalAccounts(msalAuth);
    } else {
      errorToastMessage(message: 'MSAL error: ${e.message}');
    }
  } on MsalServiceException catch (e) {
    if (e.errorCode == 'access_denied') {
      errorToastMessage(message: 'Access denied by Microsoft.');
    } else {
      if (e.message.contains('ERR_INTERNET_DISCONNECTED') || e.message.contains('ERR_NETWORK_CHANGED')) {
        errorToastMessage(message: NavigationService.currentContext.l10n.noInternetError);
      } else {
        errorToastMessage(message: 'Service error: ${e.message}');
      }
    }
  } on SocketException {
    errorToastMessage(message: NavigationService.currentContext.l10n.noInternetError);
  } catch (e) {
    debugPrint(e);
  }
}

  ///2. Acquires an ID token from the MSAL authentication flow.
  Future<MultipleAccountPca> _msalAuthCreate() {
    final clientId = SsoConfig.clientId;
    final configFilePath = SsoConfig.configFilePath;
    final redirectUri = SsoConfig.redirectUri;

    return MultipleAccountPca.create(
      clientId: clientId,
      androidConfig: AndroidConfig(configFilePath: configFilePath, redirectUri: redirectUri),
      appleConfig: AppleConfig(),
    ).then((pca) async {
      print('MSAL SingleAccountPca created successfully $pca');
      // Acquire token (login)
      return pca;
    }).catchError((error) {
      print('MSAL creation failed: $error');
      throw error;
    });
  }

解决方案

问题并不是我的Flutter/MSAL配置——我的多租户设置是正确的。错误来自后端API,它仍然对ID令牌进行单租户的验证。一旦后端更新为正确验证多租户应用的令牌,登录流程按预期工作,返回了正确的租户ID。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章