3

我们有一堆单页应用程序,并像 appA.xyz-corp.com 和 appB.xyz-corp.com 一样部署它们。我们如何配置 Msal javascript,以便用户不必登录每个应用程序。我们已经尝试过这里提到的方法https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/Sso。然而,会话存储存储每个域“appA.xyz-corp.com”的信息,而不是使用子域“xyz.com”。对于将 msal.js 用于多个单页应用程序和用户跨应用程序无缝登录的最佳实践,我们将不胜感激。

4

1 回答 1

3

您提到的wiki也有一些关于这种具有多个域的场景的信息。本质上,您需要捕获首选用户名并将其与登录请求一起发送。要同时捕获所有应用程序的用户名,我建议将其存储在所有应用程序都知道的域范围的 cookie 中。

 // Store the username after login
 document.cookie = "msal_username=Paul@xyz-corp.com;domain=.xyz-corp.com;path=/"

 // use the username
 var username = getCookieByName("msal_username"); // find some code to do that
 userAgentApplication.loginRedirect(scopes, "&login_hint=" + username);

这样做的缺点是您需要在所有应用程序中实现它。

不同领域的应用

当应用程序托管在不同的域中时,域 A 中缓存的令牌不能被域 B 中的 MSAL.js 访问。

在 Azure AD 上自动选择帐户

...

使用登录提示

如果您没有配置 SID 声明或需要在交互式身份验证调用中绕过帐户选择提示,则可以通过在 MSAL.js 交互式方法(loginPopup、loginRedirect、acquireTokenPopup 和 acquireTokenRedirect)中提供 login_hint 和可选的 domain_hint 作为 extraQueryParameters 来实现)。例如:

userAgentApplication.loginRedirect(scopes, "&login_hint=<preferred_username>&domain_hint=organizations");

您可以通过读取用户 ID 令牌中返回的声明来获取 login_hint 和 domain_hint 的值。

login_hint 应设置为 ID 令牌中的 preferred_username 声明。

于 2019-02-27T21:10:22.013 回答