Увеличение тайм-аута сеанса до недели или более
Чтобы увеличить тайм-аут сеанса, похоже, я бы использовал следующую настройку:
<system.web>
<sessionState mode="InProc" timeout="20" />
/* Etc... */
</system.web>
Здесь время ожидания устанавливается равным 20 минутам (значение по умолчанию). И, по-видимому, максимальное значение составляет 525 600 минут или один год.
Я могу вернуться в Facebook через неделю, и я все еще вошел в систему. Вот как я хочу, чтобы приложение работало. Но в соответствии с этим ответом это может отрицательно повлиять на производительность, потому что "ваши неактивные сеансы будут оставаться в памяти веб-сервера, что может привести к перезагрузке пула приложений, что приведет к потере всего сессий для всех пользователей."
Кто-нибудь знает подробности об этом успехе? И, если это реально, есть ли более эффективный способ, чтобы пользователи регистрировались на таких сайтах, как Facebook?
UPDATE:
Ниже приведен соответствующий раздел моего текущего файла web.config.
<system.web>
<authentication mode="None" />
<sessionState mode="InProc" timeout="60" />
<compilation debug="true" targetFramework="4.6" />
<httpRuntime targetFramework="4.5.2" executionTimeout="240" maxRequestLength="20480" />
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
<customErrors mode="Off"></customErrors>
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="20971520" />
</requestFiltering>
</security>
</system.webServer>
ОБНОВЛЕНИЕ 2:
Похоже, я неправильно сопоставлял две проблемы (аутентификация и состояние сеанса). Приношу свои извинения за неправильную сортировку некоторых проблем, с которыми я работал. Моя цель - только продлить время, в течение которого пользователь выполнил вход.
Ответы
Ответ 1
Для входа в систему вы должны использовать FormsAuthentication
или ASP.NET Identity
(Улучшенная версия проверки подлинности на основе файлов cookie через FormsAuthentication
), которая позволяет сохранять cookie проверки подлинности более нескольких недель/месяцев. FormsAuthentication
является апатридом, и для поддержки нескольких серверов вы можете использовать одиночный machineKey
на всех серверах. Все примеры и учебные пособия в основном предназначены для использования FormsAuthentication
по умолчанию.
Faceboook и все используют cookie аутентификации, ни один из тел не использует Session
для входа.
В идеале Session
является плохим и в основном ненужным. Его можно заменить на HttpRuntime.Cache
. Кэш может быть легко настроен на использование какого-либо внешнего провайдера, например, кэша Fabric или Redis. Чтобы сделать кеш изолированным пользователем, вы можете просто добавить ключи кешированного элемента с именем пользователя.
UPDATE
Нет недостатка в использовании FormsAuthentication
, за исключением того, что для дешифрования файла cookie требуется небольшое количество ресурсов процессора, но этого также можно избежать путем кэширования аутентификационного билета.
Единственной причиной поддержки Session
может быть совместимость со старым приложением ASP
, которое они могут поддерживать.
В новом примере ASP.NET MVC они настроили аутентификацию на основе файлов cookie в коде (при запуске), которая не является сеансом. Хотя сеанс настроен в web.config, но пока вы не хотите ничего хранить в сеансе, вы можете полностью отключить его.
Ответ 2
Создал проект MVC с нуля с отдельной учетной записью пользователя, выбранной для Auth.
Startup.Auth.cs
public partial class Startup {
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app) {
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider {
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
ExpireTimeSpan = TimeSpan.FromDays(7)//<-- I just added this.
});
//...code removed for brevity
}
}
// Summary:
// Controls how much time the cookie will remain valid from the point it is
// created. The expiration information is in the protected cookie ticket. Because
// of that an expired cookie will be ignored even if it is passed to the server
// after the browser should have purged it
public TimeSpan ExpireTimeSpan { get; set; }
В проекте ничего не изменилось, и шаблон по умолчанию предоставил все необходимое.
ОБНОВЛЕНИЕ
На основе комментариев вы всегда можете добавить его в качестве настройки приложения в web.config и использовать ConfigurationManager
для доступа к нему. Таким образом, он может быть изменен без необходимости перекомпилировать код.
var expireTimeSpan = TimeSpan.FromDays(7);//the default
var setting = ConfigurationManager.AppSettings["ApplicationCookieExpireTimeInDays"];
if (setting != null) {
var days = 0;
if (int.TryParse(setting, out days)) {
expireTimeSpan = TimeSpan.FromDays(days);
}
}
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider {
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
ExpireTimeSpan = expireTimeSpan
});
Где web.config будет содержать настройку.
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="ApplicationCookieExpireTimeInDays" value="14" />
</appSettings>
Ответ 3
Ответ, который вы цитируете, частично верен. Это зависит от того, где хранится состояние сеанса.
Не следует беспокоиться об увеличении состояния сеанса при сохранении состояния сеанса в базе данных SQL Server. Также использование веб-ферм - что имеет смысл для обеспечения масштабируемости.
Из этой статьи:
Сохранение состояния сеанса в базе данных SQL Server
Сохранение переменных сеанса на сервере SQL имеет следующее Преимущества:
Масштабируемость: Если вы ищете очень масштабируемую опцию для хранения ваши переменные сеанса, опция SQL Server для вас. Это очень более масштабируемый вариант, чем другие. Архитектура веб-фермы может очень легко получить доступ к переменным сеанса, поскольку они являются хранилищами в независимая база данных.
Надежность: Поскольку данные физически сохранялся в базе данных, он более надежен, чем другой опции. Он имеет возможность пережить перезагрузку сервера.
Безопасность:SQL Server более безопасен, чем опция в памяти или состоянии сервера. Вы можете легче защитить свои данные, настроив SQL Server безопасности.
Это старая статья, но эти принципы все еще применяются.
При использовании памяти веб-сервера могут возникнуть проблемы.
Как увеличивается время ожидания сеанса, влияющее на производительность приложения и почему?
Если вы продлеваете продолжительность сеансов, любые предметы, хранящиеся в сеансе переменные останутся в памяти на сервере дольше. В зависимости от того, как занято ваше приложение, а также тип и количество элементов, которые вы persisits как переменные сеанса, это может ухудшить производительность.
копируется в опечатке из цитаты.
В этом вопросе также обсуждается разница между состоянием сеанса и использованием файлов cookie с FormsAuthentication
.
Должен ли я использовать состояние сеанса или FormAuthentication для отслеживания входа пользователя в систему?
Таким образом, в зависимости от того, какой тип аутентификации вы используете, вы можете пойти по пути cookie, имея в виду, что пользователь может удалить cookie из браузера, и это выведет их из системы.
Это еще одна полезная ссылка на документы.
Защита состояния сеанса