Msal v2 库,处理 SSO 注销(Node.js 和 Vue.js)

问题描述 投票:0回答:2

问题:

使用 msal v2,当用户通过 Microsoft 帐户登录应用程序时,它会将参数保存到

sessionStorage
,一切都很好,当用户在 Office.com 或使用 Microsoft SSO 的任何其他站点注销时会出现问题。由于数据仍然保存在
sessionStorage
中(尝试与
localStorage
相同),因此即使用户已注销,
AcquireSilentToken(...)
也会解析缓存的数据。

尝试过如何知道给定用户是否已使用 MSAL 登录?

它建议使用

AcquireSilentToken(...)
但它可以毫无错误地解析 Promise,因为它检查
sessionStorage

我的案例:

在中间件中我想做:

const promise = msalInstance.acquireTokenSilent(graphScopes);
  promise.then(resp=>{
    //User is logged continue next();
      }).catch(error=>{
    //User is not logged in clear sessionStorage/localStorage and next('/login')
  });

因此,如果有人可以帮助我询问用户是否已注销。我真的很感激。

javascript node.js vue.js microsoft-graph-api azure-ad-msal
2个回答
1
投票

此行为是设计使然。 AAD 服务使用 cookie 来记住您是谁并自动让您登录。

服务的注销过程会强制会话 cookie 过期。这些会话 cookie 用于在您使用这些服务时维护您的登录状态。但是,由于 Web 浏览器仍在运行,并且可能无法更新以正确处理 cookie,因此您的 cookie 可能未更新以过期并完成注销过程。默认情况下,这些 Cookie 的有效期为八小时,或者设置为在您关闭所有网络浏览器时过期。

const promise = msalInstance.acquireTokenSilent(graphScopes);
  promise.then(resp=>{
    const logoutRequest = {
           account: instance.getAccountByHomeId(homeAccountId),
    postLogoutRedirectUri: "your_app_logout_redirect_uri"
}
instance.logoutRedirect(logoutRequest);
  }).catch(error=>{
//User is not logged in clear sessionStorage/localStorage and next('/login')

});

这也是一个已知的问题


0
投票

MSAL 不会公开帐户。您可以尝试以下方法:

logout(options = {}) {
        return (req, res, next) => {
            const accessToken = req.session?.accessToken
            if (accessToken) {
                let logoutUri = `${this.msalConfig.auth.authority}/oauth2/v2.0/`;

                if (options.postLogoutRedirectUri) {
                    logoutUri += `logout?post_logout_redirect_uri=${options.postLogoutRedirectUri}`;
                }
                res.redirect(logoutUri);
            } else {
                return res.redirect("/login");
            }
        }
    }

这对我有用。这将带您退出 Microsoft 页面,您可以选择要从中注销的帐户。

© www.soinside.com 2019 - 2024. All rights reserved.