我们有一堆单页应用程序,并像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用于多个单页应用程序以及跨应用程序无缝登录的最佳做法,我们将提供任何帮助,我们将不胜感激。
答案 0 :(得分:2)
wiki you mentioned还具有有关具有多个域的此方案的一些信息。本质上,您需要捕获首选的用户名,并将其与登录请求一起发送。为了同时捕获所有应用程序的用户名,建议将其存储在所有应用程序都知道的域范围的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);
缺点是您需要在应用程序 all 中实现该功能。
不同域上的应用程序
当应用程序托管在不同的域上时,域B中的MSAL.js无法访问在域A上缓存的令牌。
在Azure AD上自动选择帐户
...
使用登录提示
如果您没有配置SID声明,或者需要绕过交互式auth调用上的帐户选择提示,则可以通过在MSAL.js交互式方法(loginPopup,loginRedirect, AcquireTokenPopup和AcquireTokenRedirect)。例如:
userAgentApplication.loginRedirect(scopes, "&login_hint=<preferred_username>&domain_hint=organizations");
您可以通过读取用户ID令牌中返回的声明来获取login_hint和domain_hint的值。
login_hint应该设置为ID令牌中的preferred_username声明。