14

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

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

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

一周后我可以回到 Facebook,我仍然登录。这就是我希望我的应用程序的行为方式。但是根据这个答案,这会对性能产生不利影响,因为“您的非活动会话将保留在 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:

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

4

3 回答 3

6

对于登录,您必须使用FormsAuthenticationASP.NET Identity(基于 cookie 的身份验证的改进版本FormsAuthentication),它允许您将身份验证 cookie 保留数周/数月以上。FormsAuthentication是无状态的,为了支持多台服务器,可以machineKey在所有服务器中使用single。默认情况下,所有示例和教程大多指导使用FormsAuthentication

Facebook 和每个人都使用身份验证 cookie,没有正文Session用于登录。

理想情况下Session是不好的,而且大多是不必要的。它可以替换为HttpRuntime.Cache. 可以轻松设置缓存以使用一些外部提供程序,例如 Fabric 缓存或 Redis。要使用户隔离缓存,您只需将缓存项的键附加到用户名即可。

更新

除了解密 cookie 所需的 CPU 开销很小之外,使用没有任何缺点FormsAuthentication,但也可以通过缓存身份验证票证来避免。

支持的唯一原因可能是与他们可能支持Session的旧应用程序的兼容性。ASP

在新的 ASP.NET MVC 示例中,他们在代码中(在启动时)配置了基于 cookie 的身份验证,这不是会话。虽然 session 是在 web.config 中配置的,但只要你不想在 session 中存储任何东西,你可以完全禁用它。

于 2017-08-21T15:47:25.317 回答
2

从头开始创建一个股票 MVC 项目,并为 Auth 选择了个人用户帐户。

启动.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>
于 2017-08-21T16:54:47.687 回答
1

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

在 SQL Server 数据库中存储会话状态时,增加会话状态应该没有问题。还使用 Web Farms - 这对于满足可扩展性是有意义的。

从这篇文章:

在 SQL Server 数据库中存储会话状态

在 SQL Server 中存储会话变量具有以下优点:

可扩展性:如果您正在寻找一个高度可扩展的选项来存储会话变量,那么 SQL Server 选项适合您。这是一个比其他选项更具可扩展性的选项。Web 场架构可以非常轻松地访问会话变量,因为它们存储在独立的数据库中。
可靠性:由于数据物理持久化在数据库中,因此比其他选项更可靠。它有能力在服务器重新启动后幸存下来。
安全性: SQL Server 比内存或状态服务器选项更安全。您可以通过配置 SQL Server 安全性更轻松地保护您的数据。

这是一篇旧文章,但这些原则仍然适用。

使用 Web 服务器的内存时可能会出现问题。

增加会话超时如何影响应用程序性能,为什么?

如果延长会话的持续时间,会话变量中保存的任何项目都将在服务器的内存中保留更长时间。根据您的应用程序的繁忙程度,以及您作为会话变量保留的项目的类型和数量,这可能会降低性能。

从报价单中复制错字。

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

我应该使用 Session State 还是 FormAuthentication 来跟踪登录用户?

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

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

保护会话状态

于 2017-08-21T16:06:06.293 回答