【发布时间】:2026-02-07 07:15:02
【问题描述】:
我们正在讨论表单身份验证的真正工作原理。
是所有标识用户已登录的信息都存储在 cookie 中,还是某些信息存储在会话中?
【问题讨论】:
标签: c# asp.net .net session forms-authentication
我们正在讨论表单身份验证的真正工作原理。
是所有标识用户已登录的信息都存储在 cookie 中,还是某些信息存储在会话中?
【问题讨论】:
标签: c# asp.net .net session forms-authentication
关于被认证用户的信息存储在 cookie 中的 FormsAuthenticationTicket 中,默认命名为 .ASPXAUTH。
有关用户会话的信息与有关身份验证的信息是分开的。会话标识符可以存储在 cookie 中(与身份验证 cookie 不同的 cookie),或者正如Henk 所指出的那样,存储在无 cookie 会话中,即作为 URL 的一部分。
在用户会话中存储有关身份验证的一些信息的问题是,会话直到在处理管道中的身份验证事件(IIRC 之后的 5 个事件)之后的某个时间才可用,在 PostAcquireRequestState 中。这意味着您在身份验证之前无法访问会话中的身份验证数据!
可以在会话中存储数据并用该数据覆盖IIdentity 和IPrincipal,但这确实意味着用户身份将在会话可用之前拥有一些事件数据和不同的事件数据会话可用后,这可能是也可能不是问题。此外,您可能希望以某种方式对会话中的数据进行加密保护。
要回答您的标题问题,表单身份验证不需要会话;它们是用于不同目的的不同实体。
【讨论】:
有关表单身份验证的工作原理,您可以查看以下链接:
Forms 身份验证适用于 Web 场场景,其中处理来自 Forms 身份验证用户的请求的服务器可能与实际对用户进行身份验证并发出 Forms 身份验证票证和 cookie 的服务器不同,除非配置了无 cookie 表单身份验证。为了使这项工作,根据第一个链接的 Web Farm Scenario 部分:
要解决此问题,网络场中所有计算机上的validationKey 和decryptionKey 值必须相同。有关配置 machineKey 元素的详细信息,请参阅如何:在 ASP.NET 2.0 中配置 MachineKey。
这表明表单身份验证不会在 ASP.NET 会话中存储任何内容。否则,您还需要就地设置某种形式的进程外会话管理。
我手头还有一个示例表单身份验证应用程序,并想快速证明这一点。在通过 Forms Authentication 进行身份验证并登陆主页后,我重新启动了示例应用程序正在运行的应用程序池,该应用程序池应该会终止用户会话。然后,我单击主页上需要身份验证的链接之一,并且能够转到该链接而无需重定向到登录页面。
【讨论】: