如何判断已使用MSAL登录的用户是否已登录?

15

使用 msal.js 库(Microsoft 身份验证库),如何确定用户是否已经登录?我的意图是,如果用户的凭据已经保存在浏览器中,避免显示登录弹出窗口。

我目前的方法:

function isUserLoggedIn(username) {
 const agent = msal.UserAgentApplication(...);
 const user = agent.getUser();
 return user != null && user.displayableId === username);
}

但我不确定是否需要检查用户的凭据是否已过期。哪种方法是正确的?


这份文档对你有帮助吗? - Jenny
不是在这个具体情况下,但谢谢。 - Daniel San
2个回答

15

使用MSAL代理实例,您可以获取用户信息,因为它已被缓存。获取信息(例如userId)并不意味着用户的凭据仍然有效(已登录)。 要100%确定用户已登录,请请求一个token。

const promise = agent.acquireTokenSilent(...)

如果用户未登录,则承诺将被拒绝并出现错误代码user_login_error,另一方面,如果用户仍然登录,则承诺将得到解决。


如果用户已经被缓存,agent.acquireTokenSilent(...)也会被解决。例如,我使用msal登录到我的网站,然后在office.com上注销办公室帐户。如果我创建中间件来使用您的acquireTokenSilent(...),它将从缓存中给我已登录的用户,而不是说已注销。您知道如何解决这个问题吗? - Jozef Barca
1
@JozefBarca 如果我没记错的话,你的应用程序在ActiveDirectory中应该有一个可配置的“单点注销”URL。当用户从应用程序A注销时,应用程序A应将用户重定向到租户的“注销URL”。这将停用租户中的会话。然后,ActiveDirectory租户应通过调用其“单点注销”URL Webhook来通知其他应用程序用户已注销。这允许所有其他相关应用程序在本地注销用户。我认为该功能被称为Single-Log-Out(单点注销)。 - bpossolo
基于错误进行决策并不是最佳实践。应将Hussein Dahir的答案标记为被接受的答案。 - I Stand With Russia

10

从MSAL示例中,他们是这样检查的:

let isLoggedIn = this.authService.instance.getAllAccounts().length > 0;

1
这是正确的答案。接受的答案设定了一种叙述,即在错误上做出决策是正常的。 - I Stand With Russia
2
我不认为这意味着该令牌是有效的,而且使用这种方法遇到了一些问题。 - Ben Morris

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