如何同步表单身份验证cookie和Asp.Net Session的生命周期?

Ale*_* K. 12 asp.net security session forms-authentication

我正在构建一个ASP.NET网站,它使用FormsAuthentication和标准的Session机制配置如下:

<authentication mode="Forms">
    <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/>
</authentication>
...
<sessionState timeout="20" cookieless="UseCookies" />
Run Code Online (Sandbox Code Playgroud)

似乎身份验证cookie的生命周期不等于用户Session的生命周期.所以ASP.NET并不能保证这一点

  1. 用户注销时会话终止,

  2. 在用户注销之前,会话不会终止.

有没有办法定制FormsAuthentication或\和会话状态机制来实现这些目标?

Luc*_*cas 10

我多次听过这个问题,我的回答通常是"你为什么要这个?".一个不需要另一个,它们的到期时间应该使用不同的标准来确定.

会话状态不需要用户登录.应用程序甚至不需要使用身份验证来使用会话状态.即使在登录之前,您也可以拥有一个用户已经在使用会话状态的Web应用程序,并且在注销后仍然可以使用它.这里的"会话"是指客户端(Web浏览器)连接到站点,跳转几页并离开.用户是否登录是无关紧要的.如果您关闭浏览器,打开一个新浏览器,然后返回该站点,则会创建一个新会话.但服务器不知道您关闭了旧的浏览器窗口,因此原始会话仍然存在.对于可伸缩性(主要是内存)目的,我们使会话到期并释放其内存和会话跟踪资源.如果客户端花费太长时间来发出新请求,则新请求将创建新会话.

另一方面,您可以使用身份验证,而不是使用会话状态.我通常启动我的应用程序,会话状态和视图状态都被禁用,只有在真正需要时才会启用它们,并且逐页(或视频状态控制).

会话到期时间应由每个会话使用的内存,Web服务器上可用的内存,并发用户数和其他可伸缩性需求确定.通常在几分钟到一小时的范围内.

身份验证在客户端上作为cookie持久存在,并且基本上不会消耗服务器的任何资源.可伸缩性方面,登录到期通常可以比会话到期时间长.实际上,用户可以无限期地保持登录状态.当身份验证过期时间缩短时,通常是出于安全原因.如果您离开计算机15分钟,您不希望您的银行网站帐户可供其他人使用,对吗?您可以登录gmail或Facebook并选择"记住我"并在几天后返回并且您仍然登录.但当然这将是一个新会话,因为没有Web应用程序应该保留会话数据几天.

现在,我看到很多人使用相同的时间进行身份验证和会话过期.当用户注销时,许多人还会放弃他们的会话.但是他们忘记了你仍然需要管理用户仍然登录但会话已经过期的情况(在下一个请求中创建一个新的会话),或者当用户的身份验证过期而不是他们的会话时(需要他们)再次登录,但携带一个旧的未过期会话,可能与另一个用户的敏感数据).无论您最终为您的申请选择何种超时,处理这些案件都非常重要.


Rob*_*son 6

没有内置机制,因为现实是您希望让用户登录的时间超过您希望保持其会话的时间.此外,会话并不意味着保证存储,您应该避免依赖会话中的数据.

当身份验证cookie过期时,服务器上什么都不会发生.没有跟踪状态.

您可以在"注销"链接和处理程序中Abandon使用SignOutFormsAuthentication,但没有任何内容强制用户从网站注销.

有些人喜欢Session,但是大多数人讨厌或者讨厌它,因为它的使用被滥用了.主要原因是会话过度使用往往是服务器性能低下的原因,不正确的会话使用可能会创建无法扩展的网站.

如果可以,请避免使用Session,如果必须使用它,请遵守MSDN文章" 改进ASP.NET性能"中的建议.另请参阅了解会话状态模式+常见问题解答,特别是问:为什么没有解雇Session_End?