科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET 2.0 中的窗体身份验证

ASP.NET 2.0 中的窗体身份验证

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

ASP.NET 窗体身份验证在 IIS 身份验证完成后发生。可以使用 forms 元素配置窗体身份验证。

作者:佚名 来源:论坛整理 2007年11月5日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
•服务器查找一个身份验证 Cookie。如果找不到该身份验证 Cookie,则用户重定向到配置好的登录页 (Login.aspx),该页由 forms 元素的 LoginUrl 属性。用户通过该窗体提供和提交凭据。有关起始页的信息存放在使用 RETURNURL 作为密钥的查询字符串中。服务器 HTTP 应答如下所示:

  302 Found Location:

  http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx

  •浏览器请求 Login.aspx 页,并在查询字符串中包括 RETURNURL 参数。

  •服务器返回登录页以及 200 OK HTTP 状态代码。

  •用户在登录页输入凭据,并将该页(包括来自查询字符串的 RETURNURL 参数)发送回服务器。

  •服务器根据某个存储(如 SQL Server 数据库或 Active Directory 用户存储)验证用户凭据。登录页中的代码创建一个包含为该会话设置的窗体身份验证票的 Cookie。

  在 ASP.NET 2.0 中,可以通过成员身份系统执行对用户凭据的验证。Membership 类为此提供了 ValidateUser 方法,如下所示:

以下是引用片段:
if (Membership.ValidateUser(userName.Text, password.Text))
  {
  if (Request.QueryString["ReturnUrl"] != null)
  {
  FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
  }
  else
  {
  FormsAuthentication.SetAuthCookie(userName.Text, false);
  }
  }
  else
  {
  Response.Write("Invalid UserID and Password");
  }

  注 使用 Login Web 服务器控件时,它自动为您执行以下步骤。下文使用了前面提供的代码。

  •对于经过身份验证的用户,服务器将浏览器重定向到查询字符串中的 RETURNURL 参数指定的原始 URL。服务器 HTTP 应答如下所示:

  302 Found Location:

  http://localhost/TestSample/default.aspx

  •重定向之后,浏览器再次请求 Default.aspx 页。该请求包括身份验证 Cookie。

  •FormsAuthenticationModule 类检测窗体身份验证 Cookie 并对用户进行身份验证。身份验证成功后,FormsAuthenticationModule 类使用有关经过身份验证的用户的信息填充当前的 User 属性(由 HttpContext 对象公开)。

  •由于服务器已经验证了身份验证 Cookie,因此它允许访问并返回 Default.aspx 页。

  FormsAuthenticationModule

  ASP.NET 2.0 在计算机级 Web.config 文件中定义了一组 HTTP 模块,包括大量身份验证模块,如下所示:

以下是引用片段:

<httpModules>
  ...
  <add name="WindowsAuthentication"
       type="System.Web.Security.WindowsAuthenticationModule" />
  <add name="FormsAuthentication" 
       type="System.Web.Security.FormsAuthenticationModule" />
  <add name="PassportAuthentication" 
       type="System.Web.Security.PassportAuthenticationModule" />
  ...
</httpModules>
  

  每个请求只能使用一个身份验证模块。所使用的身份验证模块取决于 authentication 元素(通常位于应用程序的虚拟目录中的 Web.config 文件中)指定了哪种身份验证模式。

  当 Web.config 文件中包含以下元素时,激活 FormsAuthenticationModule 类。

以下是引用片段:
<authentication mode="Forms" />

  FormsAuthenticationModule 类构造一个 GenericPrincipal 对象并将其存储在 HTTP 上下文中。GenericPrincipal 对象保存对一个 FormsIdentity 实例的引用,该实例代表当前经过身份验证的用户。应该允许窗体身份验证为您管理这些任务。如果应用程序有特定要求(例如,将 User 属性设置为一个实现 IPrincipal 接口的自定义类),则该应用程序应该处理 PostAuthenticate 事件。FormsAuthenticationModule 验证了窗体身份验证 Cookie 并创建了 GenericPrincipal 和 FormsIdentity 对象之后,会发生 PostAuthenticate 事件。在该代码中,可以构造一个包装 FormsIdentity 对象的自定义 IPrincipal 对象,然后将它存储在 HttpContext. User 属性中。

  注 如果执行了这一操作,还需要设置 Thread.CurrentPrincipal 属性上的 IPrincipal 引用,以确保 HttpContext 对象和该线程指向相同的身份验证信息。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章