一、MembershipProvider简介
在ASP.NET中,通常使用MembershipProvider实现认证和授权。 MembershipProvider是ASP.NET身份验证机制中最重要的一个组件。它是一个抽象类,用于提供基本的身份验证和授权功能。实现MembershipProvider,可以扩展用户帐户管理、密码策略和密码存储等内容。和其他ASP.NET提供程序一样,MembershipProvider是可以替换的。
在基本考虑之外,MembershipProvider还可以产生附加效果。它可以在Application_Start时使用,用于初始化MembershipProvider,一般遵循“一次初始化,多次调用”的原则。并且,它可以作为授权方式,限制某些操作,这样可以针对不同的用户类型提供不同的服务。
由于MembershipProvider有非常强大的基本功能,如储存、管理并安全地使用密码等。 它可以创建Web应用程序的基本认证和授权机制,还允许应用程序提供各种供用户选择的机制。这可以大大扩展允许用户来进行身份验证的方式,包括使用本地数据库、Active Directory、OAuth等等。
MembershipProvider允许应用程序将身份验证数据存储在不同的数据存储机制中,包括SQL Server数据库、Oracle数据库、Active Directory和Access数据库等。此外,还可以使用MembershipProvider重定向到不同的管理页面和返回不同格式的反馈信息。由于MembershipProvider的这种灵活性,它是许多Web应用程序的首选身份验证方案。
二、MembershipProvider的实现
如果要实现MembershipProvider,需要继承MembershipProvider并结合自己的存储方案来处理数据记录。在实例过程中,需要定义以下六个主要的方法:
1. CreateUser():创建新用户,必要时提供用户资料存储区的值。
2. ValidateUser():验证用户名和密码。
3. GetUser():返回一个MembershipUser对象,包括规范化的用户名和电子邮件。
4. GetUserIdByUsername():返回为用户名生成的用户ID。
5. GetUserNameByUserId():返回由用户ID生成的用户名。
6. ChangePassword():更改现有用户的密码。
从上述列表中可以看出,继承MembershipProvider类的过程主要包括以下三个方面的工作:
1. 定义存储逻辑和存储方式的基本规则。
2. 理解ASP.NET的默认实现,并对需要替换的方法进行重写。
3. 在Web.config文件中指定新的MembershipProvider。为了使用自己的MembershipProvider,必须在Web.config文件中指定它。而且,可以根据需要指定不止一个MembershipProvider。
linq to sql(LTS)经常被用作用于MembershipProvider的实现。LTS程序设计中包含了自定义ORM逻辑,可以在程序设计中将已分割的查询重新因式分解。因此,LTS看起来是一个实现MembershipProvider的理想选择。通过下面这个步骤,我们可以在LTS中实现MembershipProvider:
1. 建立表
对于MembershipProvider,我们需要一张对应用户的表,在LTS中就是一个对象架构(Object-to-Database Mappings)对象。
在开发过程中,最好先使用Session.Connection属性来处理表和列映射关系。
使用和属性和列相匹配的ORM框架,可以很容易地对MembershipProvider中的其他方法添加属性和映射信息。
MembershipProvider中许多文档都使用了Aspnet表。
这个表是ASP.NET的全局模式,可以根据需要扩展。这张表可以使用Aspnet_regsql工具自动创建,可以在ASP.NET中将此表作为一个默认的存储位置。自动创建的Aspnet表具有以下列:
ApplicationId:用户附加到的应用程序ID。
UserId:用户的唯一ID。
Password:用户密码的哈希值、随机数和其他数据。
PasswordFormat:密码格式。
PasswordSalt:随机数。
Email:用户的电子邮件地址。
PasswordQuestion:如果密码被重置,用于密码找回之用的问题(数组)。
PasswordAnswer:如果密码被重置,则用于密码重置的答案(数组)。
IsApproved:表示管理员是否批准用户。
IsLockedOut:表示帐户是否被锁定。
LastPasswordChangedDate:上次用户密码被更改的日期。
CreationDate:用户创建日期。
LastLoginDate:上次用户登录时的日期。
LastActivityDate:上次用户访问站点的日期。
LastLockedOutDate:用户帐户最后一次被锁定的日期。
Comment:一段描述信息。
2. 实现MembershipProvider的方法
下面是MembershipProvider中的一些重要的方法,这些方法需要在自定义MembershipProvider实现中进行实现:
1. CreateNewUser 方法
必须创建一个新的用户并向数据库添加一些所需的额外信息。
然后,它必须用CreateUserResult的两个属性数据反传到UI:CreateUserResult.IsSuccessful和CreateUserResult.ErrorMessage。
2. ValidateUser方法
它验证用户信息。不成功的结果应该反传到UI,因为如果用户信息不正确,它需要在UI中让用户重新输入。
3. ChangePassword 方法
ChangePassword 方法很重要,因为它可以从UI中接受新的密码,并在碰到正确的密码格式和规则时向数据库更新。
4. GetUser方法
返回MembershipUser对象。这是一个非常重要的方法,因为在UI中用户的用户名和电子邮件地址必须返回给用户,而且MembershipUser也要用于验证。
三、MembershipProvider应用方法
1. 使用MembershipProvider实现Web应用
在ASP.NET Web应用中,可以使用MembershipProvider实现基本的身份验证。在实际应用中,要实现AuthenticationProvider。AuthenticationProvider负责处理关于用户身份验证的流程,注册流程和其他操作,用户访问受限资源的时候,会自动转向到认证页面进行身份验证。
可以将ASP.NET的MembershipProvider集成到多种具体实现中,通过将Web应用中的密码存储到SQL Server数据库中实现。
2. 使用MembershipProvider实现业务流程
使用MembershipProvider可以实现高级的业务流程。
例如,面向管理以及员工或客户的区分,可以按照业务需求在应用中实现。
假设,管理人员和员工可以分别访问他们各自的页面,但客户不能访问这些页面。
使用MembershipProvider,只需为每个“用户”定义一种角色,然后就可以针对不同级别的角色对页面进行访问限制。
四、总结
MembershipProvider是 ASP.NET身份验证机制最核心的组件。它可以提供基本身份验证和授权功能,并支持扩展应用。通过自己的MembershipProvider,可以处理用户账号管理、密码策略和密码存储等方面的问题。实现MembershipProvider,可以使用LTS进行ORM逻辑自定义,或者手动进行数据库表的设置。在实际应用中,MembershipProvider主要用于Web应用的身份验证和授权,也可以应用于业务流程中进行权限控制。