我正在阅读 ASP.NET 中的表单身份验证,但有些时候无法理解:
詹姆斯输入用户名密码,它们被保存在数据库中。来自用户名的 cookie 被创建、加密并附加到响应中。据我了解,当我们收到请求时,我们需要识别收到的 cookie 来自 James,因此我们可以显示他的自定义页面。
我想了解的是系统将如何从 cookie 中检索用户名,然后从 db 加载他的信息?
我正在阅读 ASP.NET 中的表单身份验证,但有些时候无法理解:
詹姆斯输入用户名密码,它们被保存在数据库中。来自用户名的 cookie 被创建、加密并附加到响应中。据我了解,当我们收到请求时,我们需要识别收到的 cookie 来自 James,因此我们可以显示他的自定义页面。
我想了解的是系统将如何从 cookie 中检索用户名,然后从 db 加载他的信息?
Forms Auth 与存储无关。它不必使用数据库,实际上您可以将它与web.config中的用户名和密码一起使用。
所以会发生什么
在您的代码中,您可以检查Page 类 (WebForms) 中的User 属性或控制器类 (MVC) 中的User属性。
虽然您可以通过当前线程或当前上下文获取它,但不建议这样做,尤其是在您开始使用后台任务时,身份可能不会传播到线程,或者上下文可能会更改。
您会注意到,当用户登录时,没有任何内容存储在数据库中。这一切都在表单身份验证令牌中,并且在每次请求时从其存储中检索用户的工作已为您完成。
Afaik Forms Authentication 不会在任何数据库中存储或加载任何内容。您可以使用数据库来存储用户名和密码,也可以将它们放在 web.config 中。如何存储用户凭据并对其进行验证取决于您,并且可以与表单身份验证分开进行。
一旦您验证了用户(针对数据库或其他一些逻辑存储),您就可以使用 FormsAuthentication 来编写身份验证 cookie。您无需担心解密 cookie。
您可以从 System.Threading.Thread.CurrentPrincipal.Identity.Name 获取用户名。要从数据库中检索用户信息,您将使用主体身份名称的值查询数据库。
对评论的回应
对,您可以将表单身份验证与成员资格提供程序、活动目录或您自己的自定义用户数据库一起使用。FormsAuth 根本不关心密码,除非它存储在 web.config 中(如吹镖更完整的答案中所述)。它只是写入 cookie,该 cookie 被解密并用于自动创建线程标识。
附加信息
尽管这被标记为答案,但吹镖的反应要完整得多。如果您在 ASPX 页面或 MVC 控制器中需要它,您真的不应该从线程中获取标识,请使用他引用的属性。
您可以通过调用 User.Identity.Name 在 Web 表单中获取用户名,例如:
protected void Page_Load(object sender, EventArgs e)
{
string userName = User.Identity.Name;
}
ASP.NET 为您解释 cookie,您不必自己阅读。或者您的问题是如何将用户名和密码存储在数据库中?