我有一个非常简单的身份服务器4实现,我在我的有角度的APP上使用oidc-client
来进行所有安全管理。在我的身份验证服务中,我有以下内容:
@Injectable()
export class AuthService {
private manager: UserManager;
private user: User = null;
constructor() {
if (!environment.production) {
Log.logger = console;
}
this.manager = new UserManager(getClientSettings());
this.manager.getUser()
.then(user => {
this.user = user;
});
this.manager.events.addUserSignedOut(() => {
this.user = null;
this.signOut();
});
}
signOut(): Promise<void> {
return this.manager.signoutRedirect()
.then(() => {
this.manager.clearStaleState();
});
}
...more
}
export function getClientSettings(): UserManagerSettings {
return {
authority: environment.authorityUrl,
client_id: 'myclient',
redirect_uri: `${environment.baseUrl}/auth-callback`,
post_logout_redirect_uri: environment.baseUrl,
response_type: 'id_token token',
scope: 'openid profile myapi',
filterProtocolClaims: true,
loadUserInfo: true,
automaticSilentRenew: true,
revokeAccessTokenOnSignout : true,
silent_redirect_uri: `${environment.baseUrl}/silent-renew-callback`,
};
}
一切工作都非常有趣,因此我可以登录/注销而不会出现任何问题,令牌续期可以按预期进行,到目前为止效果很好。但是,当用户在同一浏览器的多个选项卡中打开应用程序并且其中一个注销时,我决定实现“自定义”行为。然后触发事件UserSignedOut,然后我注销可能打开的其余选项卡。我遇到的问题是,当用户再次进入时,将正确执行FIRST登录尝试,但是任何其他选项卡上的任何后续登录请求都将导致400错误的请求(从我的IS4中的登录方法中删除Antiforgery令牌属性这样就可以了,但我不想这么做。
如果您确实刷新了标签页,那么您就可以登录了,因此对我来说,实际状态似乎有问题吗?
我不确定是否应该在注销之前在AuthService中调用其他任何方法,还是应该使用自定义行为重新实现ValidateAntiForgeryToken。
非常感谢您的帮助!