ASP.NET 表单验证 Part.1(理解表单验证)

       只要你不想在应用程序里使用基于 Windows 的帐号,就应当使用这种类型的验证。

       表单验证是基于两个概念的全能型验证系统。首先是一个登录页面,用于验证用户(与数据库或其他数据存储相比较)。其次,这种架构在每一次请求时都将再次建立安全上下文(基于 cookie 工作),这样,用户只需登录一次。

表单验证介绍

       表单验证是一个基于票据(ticket-based),有时也称为基于令牌(token-based)的系统。这意味着当用户登录系统后,他们得到一个包含基本用户信息的票据。这些信息被存放在经过加密的 cookie 里,这些 cookie 和响应绑定在一起,因此每一次后续的请求都会被自动提交到服务器

       当请求了匿名用户无法访问的页面,ASP.NET 运行时验证这个表单票据是否有效。如果无效,ASP.NET 会自动将用户导航到登录界面。你必须创建这个登录页面并且验证此页面提交的凭证。如果用户验证成功,你通知 ASP.NET 架构验证成功(调用 FormsAythentication 类的一个方法),运行库会自动设置验证 cookie(包含了票据),然后赋给用户对这个页面的访问权限

       你所要做的仅仅是在 web.config 文件中配置表单验证,创建登录页面以及验证登录页面中的凭证。

1. 为什么要使用表单验证?

  • 你可以完全控制验证代码。表单验证在 ASP.NET 中实现,而 Windows 验证或者 Passport 验证就不同。
  • 你可以完全控制登录表单的外观。你可以完全定制页面。如果你不希望做这些,可以使用高级的成员资格 API 以及 ASP.NET 安全控件。它们包含一个现有的极易定制的登录控件。外观上的灵活性是另 2 种验证方式不具备的。Windows 验证需要使用浏览器收集凭证,Passport 验证要求用户离开你的网站去访问 Passport 站点。
  • 对任何浏览器都适用。表单验证使用标准的 HTML 作为用户界面。因为可以使用任何方式格式化登录表单,你甚至可以在移动设备上使用。
  • 它允许你决定如何存储用户信息

2. 为什么不使用表单验证?

  • 你必须创建用户界面来供用户登录。事物具有两面性。带来好处的同时毕竟也带来了额外的工作(但工作量不多)。需要指出的是,表单验证只是建立一个验证系统的框架,而不是一个完整的和现成的全内置系统
  • 你必须维护用户凭证所在的目录。不仅要设计一个方案来保存用户信息,而且需要保证它们安全地保存。
  • 你必须采取额外的预防措施防止网络传输中的截获。凭证信息以纯文本的格式从浏览器发送到服务器,这意味着任何截获它们的人都可以读取它们,这显然不是一个安全的解决方案。解决方法通常是用 SSL。现在,正确的观点是使用 SSL 确保登录页面的安全,而不是确保整个应用程序的安全。你可以配置表单验证对 cookie 加密并签名,另外,cookie 不应该包含敏感信息,因此也不会包含用于验证的密码。

3. 为什么不自己实现 cookie 验证?

       表单验证使用 cookie 将验证票据赋给客户端和用户,又叫做 cookie 验证。表面看来是相当简单的一套系统,你可能会问为什么不自己使用 cookie 或者会话变量来实现验证呢?

       很简单。开发人员不需要实现 ASP.NET 中从会话状态到 Web 框架的种种功能。ASP.NET 不仅省去了你的麻烦,而且也提供了安全地、经过严格测试并可以扩展的实现。

       ASP.NET 表单验证的一些好处如下:

  • 表单验证 cookie 是安全的
  • 表单验证是经过充分测试的
  • 表单验证和 .NET 中的安全类是整合在一起的

1. 确保验证 cookie 的安全

       默认情况下,表单验证模块将验证信息存储到 cookie 之前会对其进行加密。当 cookie 返回服务器时,它会通过一个散列码来验证 cookie 是否被做过修改。这两个过程保证了这些 cookie 是非常安全的(大多自制的 cookie 验证都是相当不安全的)。

2. 表单验证经过了良好的测试

       表单验证是 ASP.NET 的主要部分,它早已在很多 Web 程序和站点中使用了。那么多人使用,缺陷很快会被发现、公布并得到弥补。另一方面,如果你创建自己的 cookie 验证系统,就没有这种普遍测试的优势了。

3. 整合 ASP.NET 安全框架

       所有类型的 ASP.NET 验证都使用统一的框架。表单验证和这个框架是整合在一起的。比如,它整合了安全上下文(IPrincipal)对象和用户身份(IIdentity)对象。

4. 表单验证类

       表单验证最重要的部分就是 FormsAuthenticationModule它是一个 HttpModule 类,用来检测请求中现存的表单验证票据

       如果票据无效且用户访问的是一个被保护的资源,它自动将用户的请求转移到 web.config 中定义的登录页面,此时运行时甚至还没有接触到这些受保护的资源。

       如果票据有效,这个模块会自动通过初始化 HttpContext.Current.User 属性来创建安全上下文。这个属性中包含一个 GenericPrincipal 对象的默认实例,而这个实例中包含一个与当前已登录用户同名的 FormsIdentity 实例。

       你基本上不需要直接和这个模块打交道。这个模块的接口包括下表中的类,这些类是 System.Web.Security 命名空间中的一部分:

类    名

描    述

FormsAuthentication 这是和表单验证交互的主要的类。提供了关于配置的基本信息,允许你创建票据,设置 cookie。如果用户凭证验证成功,会自动将用户导航到原先请求页面
FormsAuthenticationEventArgs FormsAuthenticationModule 触发一个 Authenticate 事件,你可以捕获这个事件。事件的参数通过这个类的一个实例来打包传递。它包含了已验证用户的基本信息
FormsAuthenticationTicket 提供了用户将要被加密并存储在验证 cookie 中的信息
FormsIdentity 针对表单验证的 IIdentity 实现。还增加了 Ticket 属性,它公开了表单验证票据,你可以在这个票据中存取额外的信息,例如简单场景的缓存角色信息
FormsAuthenticationModule 这是表单验证的核心,它建立上下文,并且在必要时自动跳转到登录页面

       大多数情况下,你会使用 FormsAuthentication 类和 FormsIdentity 类,后者代表了你的应用程序中的一个成功验证的用户。下一篇文章我会讲述如何在应用程序中使用表单验证。

原文地址:https://www.cnblogs.com/SkySoot/p/2998231.html