使用 msal v2,当用户通过 Microsoft 帐户登录应用程序时,它会将参数保存到
sessionStorage
,一切都很好,当用户在 Office.com 或使用 Microsoft SSO 的任何其他站点注销时会出现问题。由于数据仍然保存在 sessionStorage
中(尝试与 localStorage
相同),因此即使用户已注销,AcquireSilentToken(...)
也会解析缓存的数据。
它建议使用
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')
});
因此,如果有人可以帮助我询问用户是否已注销。我真的很感激。
此行为是设计使然。 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')
});
这也是一个已知的问题。
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 页面,您可以选择要从中注销的帐户。