.Net Forms身份验证是否需要会话?

时间:2011-01-03 10:37:41

标签: c# asp.net .net session forms-authentication

我们正在讨论表单身份验证的确如何运作。

是否所有标识用户的信息都存储在cookie中,或者是否存储在会话中的某些信息?

2 个答案:

答案 0 :(得分:12)

有关正在通过身份验证的用户的信息存储在Cookie中的FormsAuthenticationTicket中,默认名称为 .ASPXAUTH

有关用户会话的信息与有关身份验证的信息不同。会话的标识符可以存储在cookie(与身份验证cookie不同的cookie)中,或者如Henk指出的那样,存储在无cookie会话中,即作为URL的一部分。

在用户会话中存储有关身份验证的一些信息的问题是,在PostAcquireRequestState处理管道中的身份验证事件(后续5个事件IIRC)之后的一段时间内,该会话才可用。这意味着在身份验证之前,您无法访问会话中的身份验证数据!

可以在会话中存储数据并用该数据覆盖IIdentityIPrincipal,但这确实意味着在会话可用之前用户身份将包含事件的一些数据且不同会话可用后事件的数据,这可能是也可能不是问题。此外,您可能希望以某种方式在会话中以加密方式保护该数据。

要回答您的标题问题,表单身份验证不需要会话;它们是不同目的所需的不同实体。

答案 1 :(得分:5)

有关表单身份验证的工作原理,您可以查看以下链接:

表单身份验证在Web场方案中起作用,其中处理来自Forms身份验证用户的请求的服务器可能与实际身份验证用户的服务器不同,并且发出Forms身份验证票证和cookie,除非配置了无cookie表单身份验证。为了使这项工作,根据第一个链接的Web Farm Scenario部分:

  

要解决此问题,在Web场中的所有计算机上,validationKey和decryptionKey值必须相同。有关配置machineKey元素的更多信息,请参见如何:在ASP.NET 2.0中配置MachineKey。

表明Forms身份验证不会在ASP.NET会话中存储任何内容。否则,您还需要在适当的位置设置某种形式的进程外会话管理。

我手边还有一个示例表单身份验证应用程序,并希望快速证明这一点。通过表单身份验证进行身份验证并登陆主页后,我重新启动了运行示例应用程序的应用程序池,该应用程序池应该终止用户会话。然后,我点击了其中一个需要在主页上进行身份验证的链接,并且能够转到该链接而不会被重定向到登录页面。