Я реализовал поток кода авторизации openID Connect и PKCE с автоматическим обновлением на моем IdentityServer 4. У меня есть базовый API, ссылающийся на IdentityServer и угловой 8 front и oidc-client.js.
Когда я не авторизуюсь, oidc-клиент перенаправляет меня на страницу входа в IdentityServer, откуда я могу войти, а затем IdentityServer перенаправляет меня в угловое приложение. У меня есть токен доступа с форматом Bearer, который передается в API, и iframe, который часто появляется и связывается с IdentityServer при подключении / авторизации. Когда я выхожу из системы, меня перенаправляют на IdentityServer, а затем на мой угловой фронт, который просит меня войти.
Здесь вы можете спросить, какого черта проблема этого парня. Вот и вы:
Когда я копирую / вставляю токен Bearer внутри почтальона, я могу вечно использовать его с AccessTokenLifetime (полем db), равным 65, после выхода пользователя из системы, после усечения таблицы PersistedGrants, после выполнения «_signInManager.SignOutAsync» "_persistedGrantService.RemoveAllGrantsAsync".
Теперь я дам вам код:
Startup.cs API
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = configApp.UrlIdentityServer;
options.RequireHttpsMetadata = false;
options.ApiName = "example.api";
});
Пример метода контроллера:
[HttpGet("{id:int}")]
[Authorize]
public ActionResult<FormatedResult<Stuff>> GetStuff(int id)
{/*great stuff*/}
Метод углового выхода из системы
async logout() {
this.manager.signoutRedirect()
.catch((error) => {
});
this.manager.signoutRedirectCallback()
.then(() => {
this.manager.removeUser();
})
.then(() => {
this.user = null;
})
.catch((error) => {
});
}
Настройки углового менеджера oidc
authority: 'http://example.authserver.loc/',
client_id: 'example.ng.manager',
redirect_uri: 'http://ng.example.loc:5001/callbacksignin/',
post_logout_redirect_uri: 'http://ng.example.manager.loc:5001/',
response_type: 'code',
scope: 'openid profile example.api',
filterProtocolClaims: true,
loadUserInfo: true,
userStore: new WebStorageStateStore({store: window.localStorage}),
automaticSilentRenew: true,
silent_redirect_uri: 'http://ng.example.manager.loc:5001/silent-refresh.html',
revokeAccessTokenOnSignout: true
Я, хотя и безмолвное обновление использовалось, чтобы избежать кражи токена на предъявителя и плохого парня, делающего плохие вещи с моим API в течение неограниченного периода времени. С моей реализацией плохие парни могут вечно играть с моим API.
Мои вопросы:
- Это должно произойти?
- Предоставляется ли access_token пожизненно?
- Если нет, то что я сделал не так?
- Как я могу отказать в использовании токена доступа после истечения AccessTokenLifetime? или после выхода пользователя из системы.
Примечание: я отключил все кеширование.