У меня очень простая реализация сервера идентификации 4, и я использую 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, и я выписываю остальные вкладки, которые могут быть открыты. У меня проблема в том, что, когда пользователь возвращается, ПЕРВАЯ попытка входа в систему выполняется правильно, однако любой последующий запрос входа в систему с любой другой вкладки приводит к 400 - ПЛОХОЙ ЗАПРОС (удаление атрибута токена Antiforgery из метода входа в мой IS4 тогда это работает, но я не хочу этого делать).
Если вы обновили вкладку, то вы вошли в систему, поэтому мне кажется, что с самим фактическим состоянием что-то не так?
Я не уверен, должен ли я вызывать какой-либо другой метод в моем AuthService перед выходом из системы или мне следует повторно реализовать ValidateAntiForgeryToken с пользовательским поведением для этого.
Любая помощь очень ценится, спасибо!