Мы используем 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.
Пользователь хочет «запомнить меня», что создает долгоживущий файл cookie со сроком действия 30 дней, установленным с использованием скользящего срока действия. Это позволяет пользователю оставаться аутентифицированным между сеансами браузера, и нет тайм-аута из-за бездействия, за исключением того, что он не посещает сайт более 30 дней. Настройки в моем методе запуска owin отражают, что срок действия файла cookie составляет 30 дней (CookieAuthenticationOptions.ExpireTimeSpan установлен на 30 дней). Это работает независимо от платформы браузера (насколько я могу судить).
Пользователь не хочет «запоминать меня», ожидаемое поведение должно быть таким: создается файл cookie сеанса, и когда браузер закрывается, файл cookie сеанса удаляется из браузера. Это должно гарантировать, что при следующем запуске браузера пользователь не будет аутентифицирован. Это особенно важно, когда общее устройство используется как общедоступный компьютер. Проблема в том, что не все браузеры всегда удаляют файлы cookie сеанса, некоторые оставляют их намеренно, если настройка браузера включена (хороший пример — Chrome). Файл cookie сеанса не имеет даты/времени истечения срока действия, поэтому CookieAuthenticationOptions.ExpireTimeSpan здесь не имеет значения. Вот где я ищу совета, поскольку я уверен, что я не могу быть первым, кто столкнулся с этим. Вероятно, есть способ сделать это поведение более безопасным, поскольку альтернативой является ничегонеделание и, возможно, оставление файла cookie сеанса (срок действия которого никогда не истекает!) в браузере.
См. эту ссылку для получения более подробной информации о Chrome и сеансовых файлах cookie.
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 истечет через час.
В 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
, вы можете проверить, могут ли клиенты по-прежнему активно отвечать после аутентификации (выберите произвольный интервал времени). Если клиент недоступен, аннулируйте его сеанс, изменив отметку безопасности пользователя. Это потребует, чтобы сервер поддерживал список активных клиентов, чтобы он знал, с кем связаться, и аннулировать, если связь не удалась. Я вижу много проблем с этим подходом, у меня такое ощущение, что это создаст очень хрупкий код с некоторыми возможными подводными камнями, такими как недоступный сервер, если есть кратковременные помехи в сети.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.