为了增加会话超时,我似乎会使用以下设置:
<system.web>
<sessionState mode="InProc" timeout="20" />
/* Etc... */
</system.web>
此处超时设置为20分钟(默认值)。而且,显然,最大值是525,600分钟,或一年。
一周后我可以回到Facebook,我仍然登录。这就是我希望我的应用程序运行的方式。但根据this answer,这会对性能产生负面影响,因为“您的非活动会话将保留在Web服务器内存中,这可能导致应用程序池回收,这将导致所有用户丢失所有会话。” EM>
是否有人知道有关此次性能影响的详细信息?并且,如果它是真实的,是否有一种更高效的方式来保持用户登录Facebook等网站?
更新
以下是我当前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:
看起来我错误地将两个问题(身份验证和会话状态)混为一谈。我为没有正确排序我正在谷歌搜索的一些问题而道歉。我的目标只是延长用户登录的时间。
答案 0 :(得分:6)
对于登录,您必须使用FormsAuthentication
或ASP.NET Identity
(基于FormsAuthentication
的改进版基于Cookie的身份验证),这样您就可以将身份验证Cookie保留超过数周/月。 FormsAuthentication
是无状态的,为了支持多个服务器,您可以在所有服务器中使用单个machineKey
。所有示例和教程主要指导默认使用FormsAuthentication
。
Faceboook和每个人都使用身份验证cookie,没有正文使用Session
进行登录。
理想情况下Session
很糟糕,而且大部分都是不必要的。它可以替换为HttpRuntime.Cache
。可以轻松设置缓存以使用某些外部提供程序,如Fabric缓存或Redis。要使缓存与用户隔离,您只需使用用户名附加缓存项的键即可。
<强>更新强>
使用FormsAuthentication
没有任何缺点,除了解密cookie所需的CPU开销很少,但通过缓存身份验证票证也可以避免这种情况。
支持Session
的唯一原因可能是与他们可能支持的旧ASP
应用程序兼容。
在新的ASP.NET MVC示例中,他们在代码(启动时)中配置了基于cookie的身份验证,这不是会话。虽然会话是在web.config中配置的,但只要您不想在会话中存储任何内容,就可以完全禁用它。
答案 1 :(得分: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>
答案 2 :(得分:1)
你引用的答案部分属实。它取决于会话状态的存储位置。
在SQL Server数据库中存储会话状态时,增加会话状态应该没有问题。还使用Web Farms - 这有助于提高可伸缩性。
从这篇文章:
Storing Session State in a SQL Server Database
在SQL Server中存储会话变量具有以下内容 优点:
可伸缩性:如果您正在寻找一个高度可扩展的存储选项 您的会话变量,SQL Server选项适合您。这是一个很大的问题 比其他选项更具可扩展性。 Web农场架构可以 轻松访问会话变量,因为它们是存储在一个 独立数据库。
可靠性:因为数据是物理的 坚持在数据库中,它比另一个更可靠 选项。它具有服务器重启的能力 安全强> SQL Server比内存或状态服务器选项更安全。 通过配置SQL Server,您可以更轻松地保护数据 安全
这是一篇旧文章,但这些原则仍然适用。
使用Web服务器的内存时可能会出现问题。
<强> How does increasing the session timeout effect the application performance and why? 强>
如果延长会话的持续时间,则会话中保留的所有项目 变量将在服务器上的内存中停留更长时间。取决于如何 繁忙的你的应用程序,以及你的项目的类型和数量 persisits作为会话变量,这可能会降低性能。
从报价中复印错误。
此问题还讨论了会话状态与使用FormsAuthentication
的Cookie的区别。
Should I use Session State or FormAuthentication to keep track of a signed-in user?
因此,根据您使用的身份验证类型,您可以使用cookie路由,请记住用户可以从浏览器中删除cookie,这会将其记录下来。
这是文档的另一个有用链接。
<强> Securing Session State 强>