带有 oidc-client.js 的 Angular 应用程序需要在第二个选项卡中登录

标签 angular authorization identityserver4 session-storage oidc-client-js

我在由 (oidc-client.js) + .Net Core IdentityServer4 处理的 Angular 8 中获得授权。

似乎一切正常,但当我在第二个选项卡中打开同一个应用程序时,它需要我再次登录。 IdentityServer4 有 cookie,因此只需单击 登录按钮 即可收到新 token ,而无需再次提供登录名/密码。无论如何,它仍然很烦人。

有什么办法可以解决吗?我找到了 question on githubg这可能会有所帮助。

有些人建议需要将 token 本地化从 LocalStorage 更改为 SessionStorage。但就我个人而言,SessionStorage 更好,我会把它放在那个地方。

最佳答案

如果您想在多个选项卡中使用 SessionStorage(这似乎是正确的),您可以在选项卡之间复制其数据,例如使用 LocalStorage 事件(参见下面的代码示例)或 BroadcastChannel ,如本 Q&A 中所述,或实现自动登录,如替代解决方案 does .

(function(){

    if (!sessionStorage.length) {
        // trigger the event to get anything from other tabs
        localStorage.setItem('getSessionStorage', Date.now());
    };

    window.addEventListener('storage', function(event) {

    if (event.key == 'getSessionStorage') {

        //set and remove, so do not really keep the data in LS, but push it into event 
        localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
        localStorage.removeItem('sessionStorage');

    } else if (event.key == 'sessionStorage' && !sessionStorage.length) {

        var data = JSON.parse(event.newValue);

        for (key in data) {
            sessionStorage.setItem(key, data[key]);
        }
    }
});

关于带有 oidc-client.js 的 Angular 应用程序需要在第二个选项卡中登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56792208/

相关文章:

performance - IdentityServer4调用过多导致性能问题

javascript - 如何删除值并向 JavaScript 对象添加索引列?

html - 如何在该空白处的第一行再放置一张图像?

c# - ASP.NET Core - 依赖注入(inject) - IdentityServer4 DbContext

jsp - 什么是授权 header ?它是如何使用的。它与使用登录自定义编码有何不同

java - Jaas tomcat "no security manager"

c# - Blazor WebAssembly - 用户帐户和身份服务器的最佳实践

jquery - 导航栏的引导下拉菜单不起作用( Angular )

Angular 仅适用于特定路线

authorization - 在策略或规则中动态生成 XACML 建议字符串