Поток кодов авторизации OpenID Connect и PKCE с автоматическим обновлением - PullRequest
0 голосов
/ 05 июля 2019

Я реализовал поток кода авторизации 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? или после выхода пользователя из системы.

Примечание: я отключил все кеширование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...