在多租户场景下,MSAL Flutter(msal_auth 3.5.0)返回的是主租户ID,而不是客户端租户ID
我正在将 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。