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