Автоматический выход из системы после неудачной проверки с использованием Identity Server 4, VueJS и oidc-client - PullRequest
0 голосов
/ 01 февраля 2019

Я тестирую как сервер, так и клиента на моей машине, и у меня возникает следующее: Я нормально вхожу в клиент, выполняю некоторую работу, закрываю браузер, не выходя из системы.Затем я снова открываю клиент, и я все еще вошел в систему (ожидается), но через минуту я автоматически вышел из системы (НЕ ожидается).

Я использую oidc-client.js, настроенный так:

var mgr = new Oidc.UserManager({
    userStore: new Oidc.WebStorageStateStore({ store: window.localStorage }),
    authority: 'http://localhost:5000',
    client_id: 'TST_PORTAL',
    redirect_uri: window.location.origin + '/static/callback.html',
    response_type: 'code id_token token',
    scope: 'api47 openid profile read write offline_access active_dir email',
    post_logout_redirect_uri: window.location.origin + '/',
    silent_redirect_uri: window.location.origin + '/static/silent-renew.html',
    accessTokenExpiringNotificationTime: 10,
    automaticSilentRenew: true,
    filterProtocolClaims: true,
    loadUserInfo: true
})

После дальнейшего изучения я вижу, что клиент звонит / подключается / проверяет состояние (возвращает статус 200) для поддержки единого выхода, а затем вызывает / подключает / авторизирует? Client_id ..., что не удается (302 перенаправленияto / home / error).В журналах сервера идентификации указано «в запросе на авторизацию нет пользователя» и «недопустимый тип предоставления для клиента: неявный. У меня настроены гибрид и client_credentials. Я прочитал что-то здесь , поэтому я добавил этот код при запуске IdentityServer:

services.ConfigureApplicationCookie(options =>
{
   options.Cookie.SameSite = SameSiteMode.None;
});

Но это, похоже, не помогло.

Размышляя вслух, это может быть междоменной проблемой, так как они работают на разных портах, или у меня неправильно настроены COR?Я не вижу ошибок cors. Также должен ли GET-запрос checksession иметь параметры? Я читал спецификацию, и в ней говорится о фреймах, но не о сетевом трафике, поэтому я не уверен, как должен выглядеть этот трафик.

Обновление:

Первая страница моего приложения - это целевая страница анонимной аутентификации, которая проверяет, вошли ли они в систему. Если это так, она перенаправляет их на домашнюю страницу. Коддля проверки это:

// Get signed in status without prompting to log in
getIsSignedIn() {
    console.log('Checking if signed in');
    return new Promise((resolve, reject) => {
        mgr.getUser().then(function (user) {
            if (user == null) {
                console.log('Not Signed In');
                return resolve(false)
            } else {
                if (user.expired) {
                   console.log('User expired');
                   return resolve(false)
                } else {
                    console.log('Signed In');
                    return resolve(true)
                }
            }
        }).catch(function (err) {
            console.log('Error when checking if signed in');
            return reject(false)
        });
    })
}

Кажется, это возвращает true, даже когда я открываю новый браузер. Я даже изменил Oidc.WebStorageStateStore наиспользуйте значение по умолчанию, а не localStorage.

1 Ответ

0 голосов
/ 07 февраля 2019

Есть много вещей, которые могут вызвать это поведение.

1) Единый выход (monitorSession: true) Что это делает?- После того, как вы войдете в свое приложение (после перенаправления с сервера IDP, JS OIDC-Client будет включать конечную точку CheckSession в iframe, а библиотека OIDC будет проверять этот iframe каждые 2 секунды ( по умолчанию ), чтобы убедиться, чтоЗначение файла cookie idsrv.session совпадает со значением в маркере идентификатора приложения. Если они не совпадают, OIDC будет вызывать событие выхода пользователя из системы addUserSignedOut. Как ваше приложение будет обрабатывать ваше приложение, когда вы даже получите его отOIDC. Только потому, что вы включаете единый выход, если приложение не обрабатывает, оно не вернет пользователя на страницу входа.

2) Silent-Renew (automaticSilentRenew: true) Если этот флаг включен, то значение true,вы не можете контролировать, когда должно произойти автоматическое обновление, по по умолчанию это происходит до истечения 1 минуты истечения срока действия маркера доступа.Так что, если неработающее обновление не удастся, будет инициировано событие silentrenew addSilentRenewError.Это зависит от вашего приложения, от того, как вы захотите справиться с этим, даже если это будет вызвано OIDC.

3) Из того, что вы говорите, если вы закрываете весь браузер и переходите к URL-адресу приложения URL, куки-файлы сервера идентификациидолжны быть удалены, так как они являются сессионными куки.Таким образом, если вы обработали одно событие выхода из системы, OIDC вызовет событие выхода через 2 секунды после загрузки приложения.Поскольку вы не видите страницу входа, я предполагаю, что вы, возможно, не обрабатывали это событие в своем приложении.

4) Когда происходит автоматическое обновление (до 1 минуты истечения времени действия токена), на этот раз ваше приложениебудет связываться с сервером IDP, но у вас не будет файлов cookie сеанса, когда вы закрываете браузер, и вы получите ошибку без вывода сообщений (возможно, на этот раз вы могли увидеть описанную вами ошибку), и в этом случае вы должны были обработать ошибку без вывода сообщений иВот почему вы видите экран входа в систему.(Просто дикое предположение, основанное на ваших данных).

Надеюсь, это поможет !!

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