Мы используем MVC 5.2 и структуру ASP.NET Identity для проверки подлинности с помощью экрана проверки подлинности формы (комбинация пользователя и пароля). и личность сохраняется с помощью файла cookie. У меня есть конфигурация в моем методе запуска для платформы Identity, чтобы установить срок действия файла cookie аутентификации на 30 дней, это отлично работает, когда пользователь выбирает «запомнить меня» (IsPersistent = true). Когда IsPersistent = false (пользователь решает не выбирать «Запомнить меня»), файл cookie сеанса создается по умолчанию. Этот файл cookie сеанса отлично работает в Internet Explorer, а также в FireFox, когда браузер закрывается, файл cookie теряется. В Chrome и Safari (и, возможно, в других браузерах) есть варианты, позволяющие гарантировать, что файлы cookie сеанса не будут потеряны, в этом случае пользователь остается в системе, даже когда браузер закрывается и снова открывается.

Я бы хотел, чтобы файлы cookie сеанса не сохранялись навсегда, а удалялись в течение часа. Я мог бы понять это, проверив, не активна ли учетная запись в течение X минут/часов, и пользователь никогда не выбирал «Запомнить меня», тогда личность пользователя «отклоняется» со следующим запросом, если этот промежуток времени истекает.

Кто-нибудь создал обходной путь в своей реализации ASP.NET Identity, чтобы гарантировать, что файлы cookie сеанса истекают на серверной части через время X, или, может быть, есть лучший способ обойти это ограничение? Возможно, это можно сделать с помощью пользовательской реализации CookieAuthenticationProvider или передать дату/время истечения срока действия пользовательскому утверждению, которое можно проверить где-то в процессе ValidateIdentity?

Любые идеи были бы замечательными. Заранее спасибо, -Игорь

Изменить - дополнительная информация: моя реализация аутентификации имеет 2 основных «режима» (на данный момент не могу придумать лучшего слова). Моя реализация предназначена для простой формы имени пользователя/пароля с флажком «запомнить меня». Значение флажка передается свойству IsPersistent объекта AuthenticationProperties, которое передается методу AuthenticationManager::SignIn.

  1. Пользователь хочет «запомнить меня», что создает долгоживущий файл cookie со сроком действия 30 дней, установленным с использованием скользящего срока действия. Это позволяет пользователю оставаться аутентифицированным между сеансами браузера, и нет тайм-аута из-за бездействия, за исключением того, что он не посещает сайт более 30 дней. Настройки в моем методе запуска owin отражают, что срок действия файла cookie составляет 30 дней (CookieAuthenticationOptions.ExpireTimeSpan установлен на 30 дней). Это работает независимо от платформы браузера (насколько я могу судить).

  2. Пользователь не хочет «запоминать меня», ожидаемое поведение должно быть таким: создается файл cookie сеанса, и когда браузер закрывается, файл cookie сеанса удаляется из браузера. Это должно гарантировать, что при следующем запуске браузера пользователь не будет аутентифицирован. Это особенно важно, когда общее устройство используется как общедоступный компьютер. Проблема в том, что не все браузеры всегда удаляют файлы cookie сеанса, некоторые оставляют их намеренно, если настройка браузера включена (хороший пример — Chrome). Файл cookie сеанса не имеет даты/времени истечения срока действия, поэтому CookieAuthenticationOptions.ExpireTimeSpan здесь не имеет значения. Вот где я ищу совета, поскольку я уверен, что я не могу быть первым, кто столкнулся с этим. Вероятно, есть способ сделать это поведение более безопасным, поскольку альтернативой является ничегонеделание и, возможно, оставление файла cookie сеанса (срок действия которого никогда не истекает!) в браузере.

См. эту ссылку для получения более подробной информации о Chrome и сеансовых файлах cookie.

12
Igor 23 Янв 2015 в 18:27
Я не думаю, что это хорошая идея. Основная цель использования файла cookie сеанса заключается в том, что если вы используете общедоступный компьютер, ваш логин не сохраняется, верно?
 – 
Casey
23 Янв 2015 в 18:47
Emodendroket: Если выбрано значение IsPersistent = false (помните, что я не нажимал), тогда файл cookie все равно должен стать файлом cookie сеанса. Проблема в том, что не все браузеры сбрасывают файлы cookie сеанса при закрытии браузера. Я пытаюсь предотвратить ваш сценарий: пользователь входит в систему и закрывает браузер, не выходя из системы на общем ПК.
 – 
Igor
23 Янв 2015 в 18:58
Понимаю. Тогда продолжай.
 – 
Casey
23 Янв 2015 в 19:21
1
У меня такая же проблема, ты решил ее?
 – 
Abou-Emish
15 Мар 2015 в 17:15
Нет, не сейчас. Я не стал снова работать над этим.
 – 
Igor
25 Мар 2015 в 14:27

2 ответа

Identity уже включает время истечения срока действия в данные cookie, и оно проверяется OWIN.

Чтобы ограничить срок действия файлов cookie, установите ExpireTimeSpan на час в методе ConfigureAuth в Startup.Auth.cs:

public void ConfigureAuth(IAppBuilder app)
{
    // other stuff
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        ExpireTimeSpan = TimeSpan.FromHours(1),
    });            
}

Это гарантирует, что срок действия файлов cookie истечет через час.

18
trailmax 24 Янв 2015 в 03:49
Благодарю за ваш ответ. Позвольте мне обновить мой вопрос, чтобы было яснее, в чем проблема.
 – 
Igor
24 Янв 2015 в 18:30
3
Если установлено свойство ExpireTimeSpan, функция «запомнить меня» не будет работать должным образом. Поскольку срок действия файлов cookie будет установлен на одно и то же время, независимо от того, установлен флажок или нет.
 – 
Ivan.Yu
7 Май 2016 в 12:19
Owin, кажется, действительно прослушивается здесь, expiretimespan, похоже, не работает и не устанавливает время истечения AuthenticationProperties на пару минут.
 – 
Jean-Paul
2 Фев 2017 в 18:25
И срок действия cookie никогда не истекает? только в действии кнопки «Выход»?
 – 
Kiquenet
4 Апр 2019 в 22:57
Идентификационный файл cookie по умолчанию имеет значение «Сеанс». Это означает, что он должен быть аннулирован при закрытии браузера. Если вы не используете Chrome и функцию «Продолжить с того места, где вы остановились», это сохранит файл cookie сеанса.
 – 
trailmax
5 Апр 2019 в 15:33

В Google Chrome это связано с настройкой под названием Continue where I left off.

Я считаю, что в FireFox параметр Show my windows and tabs from last time.

Если этот параметр включен (в выбранном вами выше браузере), то файлы cookie сеанса не будут удалены, состояние вашего файла cookie не имеет значения. Для этого нет прямого решения с использованием свойств cookie.


Возможные идеи для обхода

JavaScript

Вы можете прослушать событие окна window.onbeforeunload, а затем вручную удалить файл cookie в этот момент времени или попросить сервер сделать его недействительным, если пользователь решил не помнить его/ее. Этот подход предполагает, что файл cookie не является только Http ИЛИ что вы можете изменить отметку безопасности пользователя в базе данных, чтобы при следующем посещении сайта в этом браузере файл cookie был признан недействительным. Это может быть лучший подход для использования, но, возможно, у кого-то есть идея получше.

Опрос

Используя что-то вроде SignalR, вы можете проверить, могут ли клиенты по-прежнему активно отвечать после аутентификации (выберите произвольный интервал времени). Если клиент недоступен, аннулируйте его сеанс, изменив отметку безопасности пользователя. Это потребует, чтобы сервер поддерживал список активных клиентов, чтобы он знал, с кем связаться, и аннулировать, если связь не удалась. Я вижу много проблем с этим подходом, у меня такое ощущение, что это создаст очень хрупкий код с некоторыми возможными подводными камнями, такими как недоступный сервер, если есть кратковременные помехи в сети.

4
Igor 25 Ноя 2015 в 01:19