2

我正在阅读 ASP.NET 中的表单身份验证,但有些时候无法理解:

詹姆斯输入用户名密码,它们被保存在数据库中。来自用户名的 cookie 被创建、加密并附加到响应中。据我了解,当我们收到请求时,我们需要识别收到的 cookie 来自 James,因此我们可以显示他的自定义页面。

我想了解的是系统将如何从 cookie 中检索用户名,然后从 db 加载他的信息?

4

3 回答 3

6

Forms Auth 与存储无关。它不必使用数据库,实际上您可以将它与web.config中的用户名和密码一起使用。

所以会发生什么

  1. 用户登录。
  2. 用户通过成员资格提供程序(可以使用 SQL、Active DIrectory、web.config、Oracle、MySQL 等)进行身份验证
  3. 为用户创建表单身份验证令牌,并通过 cookie 放置在用户计算机上。
  4. 每个后续请求都会读取表单身份验证令牌,并查询提供者以获取用户详细信息。
  5. 用户详细信息用于在 HttpContext 和当前线程中填充用户身份以供您的代码使用。

在您的代码中,您可以检查Page 类 (WebForms) 中的User 属性或控制器类 (MVC) 中的User属性。

虽然您可以通过当前线程或当前上下文获取它,但不建议这样做,尤其是在您开始使用后台任务时,身份可能不会传播到线程,或者上下文可能会更改。

您会注意到,当用户登录时,没有任何内容存储在数据库中。这一切都在表单身份验证令牌中,并且在每次请求时从其存储中检索用户的工作已为您完成。

于 2012-01-17T16:58:07.803 回答
1

Afaik Forms Authentication 不会在任何数据库中存储或加载任何内容。您可以使用数据库来存储用户名和密码,也可以将它们放在 web.config 中。如何存储用户凭据并对其进行验证取决于您,并且可以与表单身份验证分开进行。

一旦您验证了用户(针对数据库或其他一些逻辑存储),您就可以使用 FormsAuthentication 来编写身份验证 cookie。您无需担心解密 cookie。

您可以从 System.Threading.Thread.CurrentPrincipal.Identity.Name 获取用户名。要从数据库中检索用户信息,您将使用主体身份名称的值查询数据库。

对评论的回应

对,您可以将表单身份验证与成员资格提供程序、活动目录或您自己的自定义用户数据库一起使用。FormsAuth 根本不关心密码,除非它存储在 web.config 中(如吹镖更完整的答案中所述)。它只是写入 cookie,该 cookie 被解密并用于自动创建线程标识。

附加信息

尽管这被标记为答案,但吹镖的反应要完整得多。如果您在 ASPX 页面或 MVC 控制器中需要它,您真的不应该从线程中获取标识,请使用他引用的属性。

于 2012-01-17T16:44:22.873 回答
0

您可以通过调用 User.Identity.Name 在 Web 表单中获取用户名,例如:

protected void Page_Load(object sender, EventArgs e)
{
    string userName = User.Identity.Name;
}

ASP.NET 为您解释 cookie,您不必自己阅读。或者您的问题是如何将用户名和密码存储在数据库中?

于 2012-01-17T16:44:27.877 回答