【问题标题】:Increasing session timeout to a week or more将会话超时增加到一周或更长时间
【发布时间】:2018-01-28 02:32:54
【问题描述】:

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

<system.web>
  <sessionState mode="InProc" timeout="20" />
  /* Etc... */
</system.web>

这里的超时设置为 20 分钟(默认值)。而且,显然,最大值是 525,600 分钟,即一年。

我可以在一周后返回 Facebook,但我仍处于登录状态。这就是我希望我的应用程序的行为方式。但根据this answer 的说法,这会对性能产生不利影响,因为“您的非活动会话将保留在 Web 服务器内存中,这可能会导致应用程序池回收,从而导致所有用户的所有会话丢失。”

有谁知道有关此性能影响的详细信息?而且,如果它是真实的,是否有更高效的方式来让用户像 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:

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

【问题讨论】:

  • 我敢打赌,Facebook 没有保留服务器端版本,它完全是无状态的,他们(可能)收到一个带有身份验证 cookie 的请求,然后发送响应
  • @YvetteColomb - 好吧,它们确实是两个不同的东西。 ASP.NET Session 不是身份验证(默认情况下,它依赖于一个自动的 guid-like-that-you-cannot-guess cookie),它是为当前连接的事物/东西/任何东西创建的状态包。 Auth 是 Jonathan 需要根据他的上下文设置的另一个过程
  • @YvetteColomb 如果你想批评我是如何提出这个问题的,那就试试吧。但在最初的问题中,我说我可以在一周后回到 Facebook 并且我仍然登录。这就是我希望我的应用程序的行为方式。这仍然是我想要的。
  • 你应该可以在Code\Startup.Auth.cs里面修改CookieAuthenticationOptions的定义,添加ExpireTimeSpan=你想要的。如果您不使用 ASP.NET 会话,则应将其完全删除(关闭)
  • @JonathanWood 你能告诉我们你如何验证用户的代码吗?

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


【解决方案1】:

对于登录,您必须使用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 中配置了 session,但只要你不想在 session 中存储任何东西,你可以完全禁用它。

【讨论】:

  • 我已经用我的 web.config 的相关部分更新了我的问题。它似乎没有使用表单身份验证。你知道为什么 MVC 会这样配置吗?我需要了解使用表单身份验证的缺点吗?
  • 支持Session 的唯一原因可能是与他们可能支持的旧ASP 应用程序兼容。 FormsAuthentication 没有缺点,是最推荐的解决方案。
  • 感谢您的回复,但最新版本的 MVC 使用我现在的设置进行初始化。如果这是最推荐的解决方案,为什么微软默认使用其他解决方案?
  • @JonathanWood 即使配置了会话,并不意味着它应该用于登录,您仍然可以在会话中存储一些东西,很可能在示例中没有正文删除它,人们仍然使用会话,但不适用于登录。只有很少的重要秘密信息,他们不能存储在 cookie 中。
  • 再次感谢,但我必须缺少一些东西。我没有使用 Visual Studio 2017 项目向导添加的身份验证配置更改 任何内容。因此,在我确信我没有正确配置它之前,我需要了解为什么 Microsoft 没有正确配置它。
【解决方案2】:

从头开始创建一个股票 MVC 项目,并选择个人用户帐户进行身份验证。

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; }

项目中没有其他任何更改,默认模板提供了所需的一切。

更新

基于 cmets,您始终可以将其作为应用设置添加到 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>

【讨论】:

  • 您有关于将 Visual Studio 的设置更改为使用表单身份验证的后果的任何信息吗?我很难找到一个清晰的描述,我仍然很困惑为什么微软设置它的方式不够好。这会破坏甚至影响我现有的身份验证吗?我没有使用 .NET 核心。当然,我只想在web.config中进行配置。
  • 我基本上按照库存模板进行修改以适应自定义场景。关注他们的在线资源。 docs.microsoft.com/en-us/aspnet/identity/overview/…
  • @JonathanWood 我不太明白你所说的the ramifications of changing Visual Studio's settings to using forms authentication 是什么意思,你能澄清一下吗?
  • @Nkosi 我正在使用最新版本的 Visual Studio,它为我配置了这个。现在您的回答表明它应该进行不同的配置。这只能让我想知道如果微软应该以不同的方式进行配置,为什么会这样做。而且我有足够的理解来得出结论,微软的方式不是正确的方式。
  • @Nkosi:请注意,我不想改变我不需要的任何东西。我只是想更改用户保持登录状态的时间。如果您说需要表单身份验证,那么我需要了解为什么微软默认不使用表单身份验证。
【解决方案3】:

您引用的答案部分正确。这取决于会话状态的存储位置。

在 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?

如果您延长会议的持续时间,会议期间举行的任何项目 变量将在服务器上的内存中停留更长时间。取决于如何 您的应用程序繁忙,以及您的项目类型和数量 持久化为会话变量,这可能会降低性能。

复制了引文中的错字。

这个问题还讨论了会话状态和FormsAuthentication 使用 cookie 之间的区别。

Should I use Session State or FormAuthentication to keep track of a signed-in user?

因此,根据您使用的身份验证类型 - 您可以使用 cookie 路由,记住用户可以从浏览器中删除 cookie,这会将其注销。

这是另一个有用的文档链接。

Securing Session State

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2012-01-29
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-11-23
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多