Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET表单身份验证的工作原理:从请求中识别Cookie_Asp.net_.net_Form Authentication - Fatal编程技术网

ASP.NET表单身份验证的工作原理:从请求中识别Cookie

ASP.NET表单身份验证的工作原理:从请求中识别Cookie,asp.net,.net,form-authentication,Asp.net,.net,Form Authentication,我正在阅读ASP.NET中的表单身份验证,一时无法理解: James输入用户名和密码,它们保存在数据库中。用户名中的cookie被创建、加密并附加到响应中。据我所知,当我们收到请求时,我们需要确认收到的cookie来自James,因此我们可以显示他的定制页面 我想了解的是,系统将如何从cookie中检索用户名,然后从db中加载其信息?Afaik Forms Authentication不会在任何数据库中存储或加载任何内容。您可以使用数据库存储用户名和密码,也可以将它们放在web.config中。

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

James输入用户名和密码,它们保存在数据库中。用户名中的cookie被创建、加密并附加到响应中。据我所知,当我们收到请求时,我们需要确认收到的cookie来自James,因此我们可以显示他的定制页面


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

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

验证用户(针对数据库或其他逻辑存储)后,使用FormsAuthentication写入身份验证cookie。您不必担心解密cookie

您可以从System.Threading.Thread.CurrentPrincipal.Identity.Name获取用户名。要从数据库中检索用户信息,您需要使用主体标识名为if的值来查询数据库

对评论的回应

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

其他信息


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

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

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

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

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

所以发生的是

  • 用户登录
  • 用户通过成员资格提供程序(可以使用SQL、Active DIrectory、web.config、Oracle、MySQL等)进行身份验证
  • 为用户创建表单身份验证令牌,并通过cookie将其放置在用户计算机上
  • 每个后续请求读取表单身份验证令牌,并查询提供者以获取用户详细信息
  • 用户详细信息用于在HttpContext和请求的当前线程中填充用户标识,然后可供代码使用
  • 在代码中,可以检查页面类(WebForms)中的属性或控制器类(MVC)中的属性

    虽然您可以通过当前线程或当前上下文获得它,但不建议这样做,特别是在您开始使用后台任务时,在后台任务中,标识可能不会传播到线程,或者上下文可能会更改


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

    使用字符串解析和SQL(加上一些加密)Hm,我在手册和ASP.NET手册中没有提到任何数据库。这一切看起来都像是一种魔力。我很高兴知道更多关于它是如何工作的。你刚才说“它们保存在数据库中”。它通常使用SQL Server或Access;它是在Web.configThank中配置的。据我所知,通过表单身份验证,我们可以发送加密的cookie。然后,当请求到来时,系统检查其cookie信息,然后将其解密回FormsAuthenticationTicket并设置Identity.Name。那就看我们怎么处理了。对吗?@arctic_dev-对。要处理身份验证、授权和存储用户相关信息,可以使用ASP.NET中的提供程序。当然,也可以自己动手。谢谢,我知道我们可以使用会员资格提供商转到MSSQL或使用裸表单身份验证,然后自己完成所有工作。如果您想自己完成工作(为什么?!),那么正确的方法是创建您自己的会员资格提供商,这样,标准ASP.NET部件就可以使用您的自定义代码。感谢您提到用于检索用户名的属性!auth cookie中存储了哪些内容?