如何使用MSAL更新ID令牌?

9
我目前正在尝试使用WebAPI开发一个SPA应用程序,我使用msal进行登录。流程是用户登录,获取idtoken(用于授权我的api),然后使用acquiretokensilent方法获取访问令牌(用于graph api)。我通过在scopes中传递clientID,在一个小时之前使用acquiretokensilent更新idToken。但是在idToken过期后,我仍然被注销了。我发现它没有在浏览器存储中刷新。
因此,我的问题是,有没有办法更新id Token并保持用户登录?任何帮助都将是很棒的。
4个回答

2

acquireTokenSilent(scopes: Array, authority?: string, user?: User, extraQueryParameters?: string): Promise - 用于从缓存中获取令牌。如果缓存的令牌未过期,则MSAL将返回缓存的令牌;否则,它将使用隐藏的iframe向STS发送请求以获取访问令牌。要更新idToken,应在scopes数组中仅传递clientId。

https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/Public-APIs

您有没有可能在尝试刷新令牌时,实际上是因为它尚未过期而从缓存中检索到了它?


谢谢您的回复。我确实阅读了这份文档,也检查了令牌过期时间并确认它会更新,所以我确定它不是从缓存中获取的。 - CKS

2
Azure AD中ID令牌的过期时间为1小时。只要用户与AAD的会话处于活动状态,acquireTokenSilent方法就能够更新idtokens。但是,如果AAD会话已过期,则令牌更新将失败。您需要使用交互式调用来处理失败,并提示用户重新登录。
您可以阅读此处了解扩展已登录的AAD会话的方法。另外,您可以按照此处文档中的说明配置id令牌的生命周期策略。

1

我不是在刷新它,我正在尝试更新它。当你只将appid作为范围传递给acquiretokensilent方法时,你会得到一个新的idToken。我知道隐式流程不允许您刷新令牌。 - CKS

0

您可以通过SSO使用新的id_token,从而实现身份验证。

如果令牌和当前时间之间的时间差超过5分钟,则会从SSO获取新的令牌。请注意,这仅在您拥有活动会话时才有效。

 this.adalSvc.instance.acquireTokenSilent(tokenRequest)
                .then( (token: any) => {
                   const rem_id_token_Time = this.diff_minutes(new Date(token.idTokenClaims.exp * 1000), new Date());
                   console.log(rem_id_token_Time);
                   if ( rem_id_token_Time > 5) {
                     this.shared.refreshToken(token.idToken, token.accessToken);
                     resolve (token.accessToken);
                   } else {
 
                       const ssoRequest = { loginHint: token.account.username };
                       this.adalSvc.instance.ssoSilent(ssoRequest)
                         .then(() => {
                           this.shared.refreshToken(token.idToken, token.accessToken);
                           resolve (token.accessToken);
                         })
                         .catch(error => {
                           reject(error);
                         });
                   }
 
                   }

diff_minutes(dt2, dt1) {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= 60;
  return Math.abs(Math.round(diff));

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接