使用Azure AD和MSAL的SPA应用之间的SSO

时间:2019-02-27 14:40:51

标签: azure azure-active-directory single-sign-on msal msal.js

我们有一堆单页应用程序,并像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用于多个单页应用程序以及跨应用程序无缝登录的最佳做法,我们将提供任何帮助,我们将不胜感激。

1 个答案:

答案 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声明。