将会话超时增加到一周或更长时间

时间:2017-08-19 15:00:15

标签: asp.net asp.net-mvc web-config asp.net-authentication

为了增加会话超时,我似乎会使用以下设置:

<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:

看起来我错误地将两个问题(身份验证和会话状态)混为一谈。我为没有正确排序我正在谷歌搜索的一些问题而道歉。我的目标只是延长用户登录的时间。

3 个答案:

答案 0 :(得分:6)

对于登录,您必须使用FormsAuthenticationASP.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