User.Identity数据来自哪里?

时间:2010-04-14 11:16:25

标签: asp.net-mvc-2

例如:如果我正在检索User.Identity.Name,它是来自.ASPXAUTH cookie还是使用我的会员提供者从数据库中检索?

访问User.Identity时是否发出了任何数据库请求?

感谢。


编辑:现在我很确定它来自身份验证票证cookie,但找不到任何官方文档来确认这一点。任何人吗?

4 个答案:

答案 0 :(得分:1)

我认为身份验证信息特定于会话并在ASP.net进程内部或外部甚至SQL服务器中维护。一旦用户被认证,就会生成会话令牌,该令牌用于跟踪状态服务中经过身份验证的用户的信息。在后续请求中,会话令牌用于检索用户身份,以及我们获取预填充对象(如User.Identity.Name)的位置。这必须在表单身份验证模块或Windows身份验证模块中实现,具体取决于正在使用的身份验证类型。如果设置为cookieless身份验证模式,则会话令牌将显示在URL中。会话到期后,将从状态服务中删除与会话相关的所有信息。

希望这说清楚!

答案 1 :(得分:1)

这取决于您使用的会话类型。可以使用两个参数来改变会话 1.使用Cookies-Cookieless,或使用cookie 2.存储会话状态信息的过程-Inproc(进程中),outproc(ASP.net状态服务)或Sql Server。

如果使用Sql Server存储状态信息,则肯定会进行数据库查询以获取会话数据。 更多细节 -

http://www.codeproject.com/KB/aspnet/ExploringSession.aspx

答案 2 :(得分:1)

这应该回答你的问题...

“表单身份验证票证不仅包括用户的身份,还包含有助于确保令牌的完整性和安全性的信息。”摘自以下Microsoft文章:

http://www.asp.net/security/tutorials/forms-authentication-configuration-and-advanced-topics-vb

除了这个解释之外,观察ASP.NET行为还支持这样的结论:用户名实际上存储在ASPXAUTH cookie中:在用户通过身份验证后,ASP.NET不会在后续页面请求中命中数据库。您可以像我一样,通过运行SQL事件探查器来监视ASP.NET应用程序使用的数据库,从而自己证明这一点。

还要知道用户名和身份验证票据数据不存储在会话状态中。除了引发安全问题之外,这种实现方式会导致ASP.NET成员资格在会话状态被禁用时中断。这是另一个Stack Overflow答案,表明Forms Authentication(Membership)数据和Session State彼此无关:

Does FormsAuthentication.SetAuthCookie() make a session based cookie?

该答案还链接到MSDN文章here,该文章详细解释了ASPXAUTH cookie,尽管上面引用的文章似乎更新。

答案 3 :(得分:0)

.ASPXAUTH cookie / User.Identity来自身份验证(Windows,Forms)。

如果您想让用户获得会员资格,您需要使用

  Membership.GetUser()

  Membership.GetUser(User.Identity.Name )

documentation here会导致数据库调用。