表单验证解决了 ASP.NET 应用程序页面验证的问题,但另一方面,必须自己实现登录表单与底层的凭证存储之间的通信。对每一个 WEB 程序来说,这些工作几乎都是相同的,非常乏味。
而且,表单验证只提供了验证用户的架构。如果你使用一个自定义的凭证存储,就必须自己写管理用户的管理应用程序,它应当实现添加用户、删除用户、重设密码等功能。这又是一串对于 Web 程序来说差不多的工作。
ASP.NET 2.0 引入了成员资格 API,ASP.NET 4.0 保留了它。成员资格 API 是以现有的表单验证架构为基础的框架。
ASP.NET 成员资格 API 简介
成员资格 API 框架提供了一整套完整的用户管理功能:
- 通过编程或者 ASP.NET 的 Web 配置工具来创建和删除用户
- 重置用户密码,还可以自动发送密码重置邮件
- 如果用户通过后台程序创建,可以为用户自动生成密码,还可以将密码通过邮件自动发送给用户
- 提供了一系列预建控件创建登录页面、注册页面、显示登录状态、为验证过和未验证过的用户提供不同的视图
- 通过成员资格提供程序类为应用程序提供了一个抽象层,以上所有功能都可以不依赖底层的数据存储而完全独立工作。底层的数据存储也可以在不需要修改程序的情况下,使用其他类型的数据存储机制来替换。默认情况下,成员资格 API 使用 SQL Server Express 数据库存储用户和角色信息
成员资格 API 的结构(顺序亦为层次关系):
- 安全控件:登录控件、密码控件、创建用户向导、状态控件
- 成员资格 API :Membership 类、[MembershipUser 类]
- 成员资格提供程序:SQL Server 提供程序、活动目录提供程序、自定义的提供程序
- 成员资格存储:SQL Server、活动目录、自定义的存储 (例如,Oracle)
成员资格 API 的设计使其可以完全独立于它的底层数据存储来工作。作为程序的开发人员,主要就是和 ASP.NET 提供的控件以及 Membership 类打交道。所有与成员资格 API 相关的类都被放在了 System.Web.Security 命名空间中。
成员资格 API 相关的类:
| Membership | 这个类是和成员资格 API 交互的主要部分,它提供了一组方法来管理用户、验证用户以及重置用户密码 |
| MembershipCreateUserException | 当视图通过 Membership 类创建用户时,如果发生错误,会抛出一个异常 |
| MembershipUser | 代表一个存储在成员资格 API 凭证存储中的单独用户。包含此用户的所有信息,Membership 类有好几个方法返回此对象,例如 GetUser() |
| MembershipUserCollection | 成员资格用户的集合,例如 Membership.GetAllUsers() 可以返回此对象 |
| MembershipProvider | 继承这个基类可以创建自定义的成员资格提供程序,这样就可以根据你自定义的凭证存储来验证用户了 |
| MembershipProviderCollection | 计算机以及 Web 应用程序的所有可用成员资格提供程序的集合 |
| SqlMembershipProvider | MembershipProvider 类的一个实现,与 SQL Server 数据库一同工作 |
| ActiveDirectoryMembershipProvider | MembershipProvider 类的一个实现,与活动目录一同工作 |
| ActiveDirectoryMembershipUser | 这个类继承了 MembershipUser 的所有功能,并添加了一些与活动目录相关的属性 |
成员资格只用来管理和验证用户,它不实现任何授权功能,也不提供管理用户角色的功能。因此,你必须使用角色 API(后续文章会介绍)。
使用成员资格 API
使用成员资格 API 和 安全控件之前,必须完成以下步骤:
- 在 web.config 文件中配置表单验证、禁止匿名用户访问
- 建立成员资格数据存储。你必须在一个你选择的数据库中创建一些表和存储过程
- 配置数据库连接字符串和你想要在应用程序的 web.config 文件中使用的成员资格提供程序
- 创建登录页面,使用 Membership 类验证用户输入的凭证
使用 ASP.NET WAT 可以完成除了提供程序配置以外的任何配置步骤。ASP.NET WAT 包含了一个安全向导,在 VS 中选择“网站”-“ASP.NET 配置”即可:
如果在一台运行 SQL Server Express 的机器上使用 WAT,当创建第一个用户时,底层的数据存储会自动创建。当然,如果你通过编程访问成员资格数据存储,它也会自动创建,这个功能是 SqlMembershipProvider 提供的。如果是其他版本的 SQL Server,那么就需要手动配置数据源。
当使用 SQL Server Express 版本时,SqlMembershipProvider 会在 App_Data 目录中创建一个名为 ASPNETDB.MDF 的新数据库。这个数据库实现完整的架构,它是保存用户信息、角色信息、用户角色赋权、个性化和用户配置属性所必需的。
如果你想使用自己的数据库而不是自动创建的数据库来存储用户信息和角色信息,你必须在运行安全向导之前配置成员资格提供程序和这个提供程序的连接信息。
1. 配置表单验证
成员资格 API 建立在表单验证的基础上,它提供了一个现成的架构管理和验证用户。因此,必须配置程序来使用表单验证。
通常,根目录对匿名用户来说是可以访问的,它一般包含登录页面和注册页面之类的功能。因此,在根的 web.config 中只需包含启用表单验证即可:
<authentication mode="Forms" />
</system.web>