使用 localStorage 时使用 msal-react 注销所有选项卡

2023-12-10

我有一个 React 18.x 和 NextJS 12.x 应用程序,它使用msal-react1.4.4(依赖 msal-browser 2.28.0)和 Azure B2C 进行身份验证。我的配置是这样的:

export const msalConfig: Configuration = {
  auth: {
    clientId: clientId as string,
    authority: `https://${tenant}.b2clogin.com/${tenant}.onmicrosoft.com/${b2cPolicy}`,
    knownAuthorities: [`${tenant}.b2clogin.com`],
    redirectUri: '/openid-redirect',
    postLogoutRedirectUri: '/',
  },
  cache: {
    cacheLocation: 'localStorage',
  },
};

页面受保护<MsalAuthenticationTemplate interactionType={InteractionType.Redirect} ...>通过重定向流强制登录的组件。这一切都很好。

在我的导航栏中有一个注销按钮:

const handleLogout = () => {
  msalInstance.logoutRedirect({
    account: msalInstance.getActiveAccount(),
  });
};
<button onClick={() => handleLogout()}>
  Logout
</button>

并且选项卡本身也可以正常注销。

所有其他选项卡loose访问access_token和其他信息,以便他们有效地“注销”并且无法调用 APIbearer认证不再。但是,该应用程序的 UI 不会将用户显示为已注销。

我原以为所有其他选项卡都会注意到注销并相应更新,可能会将用户重定向到另一个页面。或者至少我会期望loggerCallback我已配置为显示某个其他选项卡已将我们注销的事件或通知。

如果我手动做window.addEventListener('storage', evt => console.log(evt));我确实看到其他选项卡通知存储正在被清除。

I found 另一个相关问题这是关于交叉device注销,我希望依赖 OpenID 会话管理规范。我想这个解决方案可能对我有用,但另一个问题或答案也包含一个可行的解决方案。

相关MSDN文档没有提到任何有关“多个选项卡”或类似内容的内容。

如何配置我的应用程序和 msal-react 以通知其他选项卡的注销?


解决方法

目前我们使用了以下解决方法:

export function useLogoutInOtherTabsListener() {
  const router = useRouter();

  useEffect(() => {
    const handler = (evt: StorageEvent) => {
      if (evt.key === 'logout-event' && evt.newValue === 'started') {
        msalInstance.logoutRedirect({
          onRedirectNavigate: () => false, // No need to do redirects via msal, we'll just route the user to '/' ourselves
        });
        router.push('/');
      }
    };

    window.addEventListener('storage', handler);
    return () => {
      window.removeEventListener('storage', handler);
    };
  }, [router]);
}
export function logoutAllTabs(): void {
  // We'd prefer to use an msal-mechanism, but so far couldn't find any.
  // See also: https://stackoverflow.com/q/73051848/419956
  window.localStorage.setItem('logout-event', 'started');
  window.localStorage.removeItem('logout-event');
  msalInstance.logoutRedirect();
}

并打电话useLogoutInOtherTabsListener() in _app.tsx.


  • 清除会话 ID 应该能够注销所有页面。为此,我们可以使用以下概念:front channel logout .

  • In front channel logout我们基本上加载一个不同的页面,该页面将完成所有注销过程并清除缓存并停止对站点的本地访问。这里页面将被加载到隐藏的 iframe 中并仅执行注销操作。

  • 但为了让它发挥作用,我们必须设置system.allowRedirectInIframe为真。此外,我们还必须在门户中注册注销 URL。

enter image description here

const msal = new PublicClientApplication({
    auth: {
        clientId: "my-client-id"
    },
    system: {
        allowRedirectInIframe: true
    }
})

// Automatically on page load
msal.logoutRedirect({
    onRedirectNavigate: () => {
        // Return false to stop navigation after local logout
        return false;
    }
});

参考下面这个文档上面的代码来自那里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 localStorage 时使用 msal-react 注销所有选项卡 的相关文章

随机推荐

  • SMJobBless 给出错误 CFErrorDomainLaunchd Code=8

    我正在尝试通过 SMJobBless 安装辅助工具 但收到以下错误 错误域 CFErrorDomainLaunchd代码 8 操作无法完成 CFErrorDomainLaunchd错误8 我验证了代码签名 应用程序的 plist 和辅助工具
  • 创建唯一的图像名称

    为我的用户上传的图像创建唯一名称的好方法是什么 我不想有任何重复项 所以像 MD5 filename 这样的东西不适合 有任何想法吗 正如所提到的 我认为创建唯一文件名的最佳方法是简单地添加 time 那就像 image name time
  • 如何让div在页面上垂直居中? [复制]

    这个问题在这里已经有答案了 如何使 box div 在页面上垂直居中居中 我尝试了垂直对齐 中间 但它不起作用 您可以实时查看该网站here 这是CSS iframe position fixed width 100vw height 10
  • 迁移到 Git LFS 和跟踪文件时的命令顺序

    我想将 LFS 用于现有的 Git 存储库并跟踪 foo文件 也转换历史文件 我想我可以这样做 git lfs track foo changed gitattributes and all foo files commit a m Sta
  • Angular 5 HttpClient 发布原始二进制数据

    我的 Web 应用程序需要通过 ProtoBuf 与我的服务器通信 为了实现这一点 我需要能够发布原始二进制数据 这是我现在正在使用的代码 这样做的问题是HttpClient将 Uint8Array 编码为 JSON 数组 因此结果不再是有
  • 监听tomcat领域认证事件

    我需要知道 tomcat 何时接受使用给定上下文的领域身份验证的登录 我一直在查看可能的可用侦听器 ServletContextListener 和 ServletContextAttributeListener 但不知道如何在登录发生时收
  • 使用后台任务设置剪贴板内容 [Windows 10] [UWP]

    我正在开发通用 Windows 10 应用程序 目前 我有一个后台任务 一旦用户收到通知就会触发该任务 该BG任务的目的是复制通知的内容 问题在于 Clipboard setcontent 方法似乎是单线程的 而不是多线程 BG 任务 我尝
  • MultipartFile / blob 保存在数据库中时出现问题

    你好 我想上传图像并将其存储到数据库中 我使用 spring mvc 和 hibernate 这是模型 import java sql Blob import java util Date import javax persistence
  • 将日期转换为月份和年份

    如何使用 python 从以下日期获取月份和年份 日期是 2011 07 01 09 26 11 This showud display as This month 2011 06 07 09 26 11 This should displ
  • Matlab,创建额外向量的替代方法?

    如果我有这个 我会收到错误 sum vector cumsum vector length vector gt gt Error indexing must appear last in an index expression 我知道我可以
  • 如何将 Bootstrap 的容器 div 调整为距左视口边缘 100px?

    我正在使用 Twitter Bootstrap 固定布局 其中容器div has margin left auto margin right auto 所以它始终位于中心 我想要做的是定位容器 以便浏览器窗口左边框和容器之间有 100px
  • UNNEST(hit.eCommerceAction),Google Bigquery

    我使用相同的逻辑来取消嵌套 hit eCommerceAction 但它不能像其他字段一样工作 对这个问题有帮助吗 另外 max if 函数是用于获取两个 hit customeDimenison value 的正确函数吗 SELECT D
  • 如何使用 summarise_each 计算加权平均值?

    如何使用 dplyr 中的 summarise each 计算数据集中所有字段的加权平均值 例如 假设我们想要将mtcars数据集由cyl并计算所有列的加权平均值 其中权重被视为gear柱子 我已经尝试过以下方法 但无法使其工作 mtcar
  • PHP 在 77FCAFF8 处遇到访问冲突

    我正在运行一个也使用 Ajax 和 jQuery 的 PHP 网站 该网站将正常运行相当长的一段时间 突然我的页面 和 ajax 检索的子页面 返回消息 PHP 在 77FCAFF8 处遇到访问冲突 看来重新启动服务器可以解决该问题 运行
  • matplotlib生成的PDF无法在acrobat reader中查看

    我正在使用 matplotlib 绘制数据 包括 LaTeX 字体 创建的 pdf 可以通过 evince inkscape GIMP 显示 但不能通过 acroread resp 显示 土坯阅读器 代码原型适用于很多图形 只有少数绘图存在
  • BulletPhysics (ammo.js) - 您将如何向物体施加力?

    澄清 ammo js是使用 mscripten 的 Bullet 物理端口 我有一个角色 本质上是一个方块 需要用力推动 我已经尝试了 我认为 所有的力方法 但我仍然无法移动方块 setVelocity 1 0 0 甚至不会移动方块 它只是
  • C++ 成员函数定义类前缀快捷方式(也是模板)

    给出以下类声明 template
  • 为什么不能使用 < 或 > 来比较 NSDate?

    NSDate date NSDate date NSDateFormatter dateFormat NSDateFormatter alloc init dateFormat setDateFormat MM dd yyyy NSLog
  • 何时使用 try/catch 块?

    我已经阅读并理解了 Try Catch 块的作用以及为什么使用它很重要 但我坚持知道何时何地使用它们 有什么建议吗 我将在下面发布我的代码示例 希望有人有时间为我的示例提出一些建议 public AMPFileEntity string f
  • 使用 localStorage 时使用 msal-react 注销所有选项卡

    我有一个 React 18 x 和 NextJS 12 x 应用程序 它使用msal react1 4 4 依赖 msal browser 2 28 0 和 Azure B2C 进行身份验证 我的配置是这样的 export const ms