Извлечение состояния сеанса без отправки HTTP-запроса от внешнего интерфейса - PullRequest
0 голосов
/ 24 сентября 2018

Настройка ASP.NET Core с Reactjs + Redux + Saga.Он должен уведомить пользователя об истечении основного сеанса asp.net.Но проблема в том, что, отправляя запросы GET для проверки состояния сеанса, мы расширяем сеанс, что означает, что сеанс никогда не закончится, если вкладка в браузере не будет закрыта (тогда запросы GET не будут отправлены).Это настройка сеанса Startup.cs

services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromSeconds(60 * 60);
                options.Cookie.HttpOnly = true;
            });

А затем мы отправляем каждые 5 минут запрос от клиента для получения идентификатора:

function* checkSessionIsValid() {
    try {
        const response = yield call(axios.get, 'api/Customer/FetchIdentity');

            if (!response.data) {
                return yield put({
                    type: types.SESSION_EXPIRED,
                });

            yield delay(300000);
            return yield put({ type: types.CHECK_SESSION_IS_VALID });
        }
        return;
    } catch (error) {
        return;
    }
}

И конечная точка бэкэнда (_context IHttpContextAccessor)):

        [HttpGet("FetchIdentity")]
        public LoginInfo GetIdentity()
        {
            if (SessionExtension.GetString(_context.Session, "_emailLogin") != null)
            {
                return new LoginInfo()
                {
                    LoggedInWith = "email",
                    LoggedIn = true,
                    Identity = ""
                };
            }

            return null;
        }

Итак, мы получаем информацию о сеансе от SessionExtension.Но, возможно, есть какой-то способ получить его, не подключаясь к серверной части?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Возможно, можно использовать атрибут SessionState.

[SessionState(SessionStateBehavior.Disabled)]

https://msdn.microsoft.com/en-US/library/system.web.mvc.sessionstateattribute.aspx?cs-save-lang=1&cs-lang=cpp

РЕДАКТИРОВАТЬ: понял, что вы используете .NET Core, не уверен, если атрибут SessionStateили что-то подобное существует на сегодняшний день.

0 голосов
/ 24 сентября 2018

То, что вы спрашиваете, невозможно, и, честно говоря, не имеет смысла, когда вы понимаете, как работают сессии.Сессия существует только в контексте запроса.HTTP - это протокол без сохранения состояния.Сеансы, по сути, являются ложным состоянием, когда сервер и клиент передают «идентификатор сеанса».Когда сервер хочет установить «сеанс» с клиентом, он выдает клиенту идентификатор сеанса, обычно через заголовок ответа Set-Cookie.Затем клиент будет передавать этот идентификатор при каждом последующем запросе, обычно через заголовок запроса Cookie.Когда сервер получает этот идентификатор, он ищет соответствующий сеанс из хранилища, а затем получает доступ к любому состоянию, в котором он был ранее.

Дело в том, что без запроса first ,сервер не знает и не заботится о том, что происходит с определенным сеансом.Часть истечения срока действия происходит, когда сервер затем пытается найти сеанс.Если он был слишком длинным (истек срок действия сеанса), то он уничтожает предыдущий сеанс и создает новый.Он не ведет активный мониторинг сессий, чтобы что-то делать в определенное время.И, как вы заметили, сеансы являются скользящими, каждый запрос в течение срока действия сбрасывает этот период.В результате сеанс никогда не истекает, пока клиент активно его использует.

Длинный и короткий, единственный способ узнать состояние сеанса - это сделать запрос с идентификатором сеанса в порядкепредложить серверу попытаться восстановить этот сеанс.Лучшее, что вы можете сделать, если хотите отслеживать истечение сеанса на стороне клиента, - это установить таймер на стороне клиента на основе известного тайм-аута.Затем вам необходимо сбросить указанное время при каждом последующем запросе.

 var sessionTimeout = setTimeout(doSomething, 20 * 60 * 1000); // 20 minutes

Затем в ваших обратных вызовах AJAX:

 clearTimeout(sessionTimeout);
 sessionTimeout = setTimeout(doSomething, 20 * 60 * 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...