首页 > 解决方案 > ValidateAntiForgeryToken 阻止新登录

问题描述

我有一个非常简单的身份服务器 4 实现,我正在使用oidc-client我的 Angular APP 进行所有安全管理。在我的身份验证服务中,我有以下内容:

@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 事件,然后我退出可能打开的其余选项卡。我遇到的问题是,当用户返回时,第一次登录尝试正确执行,但是来自任何其他选项卡的任何后续登录请求都会导致 400 - BAD REQUEST(从我的 IS4 中的登录方法中删除 Antiforgery 令牌属性然后它可以工作,但我不想这样做)。

如果您确实刷新了选项卡,那么您就会登录,因此对我来说,实际状态本身似乎有问题?

我不确定是否应该在注销之前调用 AuthService 中的任何其他方法,或者是否应该为此使用自定义行为重新实现 ValidateAntiForgeryToken。

非常感谢任何帮助,谢谢!

标签: identityserver4openid-connectoidc-client-js

解决方案


推荐阅读