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

带oidc-client.js的Angular应用程序需要在第二个选项卡中登录,angular,authorization,identityserver4,session-storage,oidc-client-js,Angular,Authorization,Identityserver4,Session Storage,Oidc Client Js,我在Angular 8中拥有由(oidc client.js)+.Net Core IdentityServer 4处理的授权 一切似乎都很好,但当我在第二个选项卡中打开相同的应用程序时,需要我再次登录。IdentityServer4具有cookie,因此单击“登录”按钮即可接收新令牌,而无需再次提供登录/密码。不管怎么说,还是很烦人 有办法解决吗?我发现这可能有部分帮助 一些人建议需要将令牌本地化从本地存储更改为会话存储。但就个人而言,SessionStorage更好,我会将其保留在那个位置。

我在Angular 8中拥有由(oidc client.js)+.Net Core IdentityServer 4处理的授权

一切似乎都很好,但当我在第二个选项卡中打开相同的应用程序时,需要我再次登录。IdentityServer4具有cookie,因此单击“登录”按钮即可接收新令牌,而无需再次提供登录/密码。不管怎么说,还是很烦人

有办法解决吗?我发现这可能有部分帮助

一些人建议需要将令牌本地化从本地存储更改为会话存储。但就个人而言,SessionStorage更好,我会将其保留在那个位置。

如果您想在多个选项卡中使用SessionStorage(这似乎是正确的),您可以在选项卡之间复制其数据,例如使用
LocalStorage
事件(请参见下面的代码示例),或者如本文所述,或者实现autologin,就像另一种解决方案

(函数(){
if(!sessionStorage.length){
//触发事件以从其他选项卡获取任何内容
setItem('getSessionStorage',Date.now());
};
window.addEventListener('storage',函数(事件){
如果(event.key=='getSessionStorage'){
//设置并删除,所以不要将数据真正保存在LS中,而是将其推送到事件中
setItem('sessionStorage',JSON.stringify(sessionStorage));
localStorage.removietem('sessionStorage');
}else if(event.key=='sessionStorage'&&!sessionStorage.length){
var data=JSON.parse(event.newValue);
用于(输入数据){
setItem(key,data[key]);
}
}
});

听起来不错,我会检查一下,如果有帮助,我会告诉你。我试图找到不太复杂的解决方案,但似乎必须通过LocalStorage在选项卡之间进行通信来完成。正如我提到的,真正的替代方法是实现autologin,然后每个选项卡都以静默方式执行挑战。来自的解决方案就是这样做的。我相信使用oidc-client.js也没有问题。尽管如此,一年前比较了这两个LIB,我们发现使用angular项目时,angular项目更方便。我使用的是angular项目,而不是oidc-client.js,它可以处理这种情况fine@ElasticCode我更喜欢oidc-client.js,因为它来自IdentityServer团队,并且最新版本,例如angular-oauth2-oidc不支持PKCE。