ASP.NET 提供了成员资格 API 和角色 API,这些 API 为你提供了一个用户和角色管理框架。但通过实现自定义的成员资格和角色提供程序来交换和 SQL Server 一起工作的默认实现,这样无需修改 Web 程序就可以交换用来存储用户和角色信息的底层存储。

       正是由于这种分层的抽象设计,一个自定义提供程序总是基于 ASP.NET 成员资格和角色框架所引入的这个分层模型中的最低层。在这个基本架构中,成员资格和角色服务彼此是独立的,它们有各自的基类。

 

       为什么要创建自定义的成员资格提供程序?

  • 你可能想使用一个现存的用户和角色数据库,它们和 ASP.NET 标准的设计模式不同
  • 你可能想使用一个别的数据库,比如 Oracle、MySql 等
  • 你可能想使用一个特别的数据存储,比如 XML 文件、Web 服务或者 LDAP 目录
  • 你可能想实现额外的验证逻辑,某些政府网站验证需要:用户名、密码、订阅 ID 等

 

       如果你只想存储默认实现方案之外的一些信息,建议你不要自己实现自定义提供程序。因为成员资格 API 赋予了对存储中唯一确认用户的主键的访问权限,添加你自己的数据库表来存储额外的信息是个好的选择,并通过用户的唯一主键将存储在你的数据表里面的信息和成员资格提供程序存储的实际用户联系起来。

       在程序中,你可以通过 MembershipUser 类的 ProviderUserKey 属性来访问用户唯一的主键。

 

创建自定义提供程序的基本步骤

  1. 设计并创建底层的数据存储机制
  2. 创建工具类访问底层的数据存储
  3. 创建 MembershipUser 的派生类
  4. 创建 RoleProvider 的派生类
  5. 创建测试程序,并配置这个自定义提供程序进行测试

       实现自定义提供程序非常简单,只是需要一些时间,因为要实现许多方法和属性。本系列文章将创建一个自定义的成员资格和角色提供程序,它使用 XML 文件作为底层的数据存储(XML 文件对于高度可扩展的程序来讲不是一个很好的解决方案)。

 

 

1. 自定义提供程序的总体设计

       需要仔细考虑解决方案的总体设计。你的目的是底层的功能尽量简单,这样可以将精力集中在实际的成员资格和角色提供程序的实现上面。具体到 XML,加载和保存数据到 XML 文件的最简单方式就是 XML 序列化。只需要调用一个函数就可以将一个完整的对象存储在文件中,调用另一个就可以读取它。

XmlSerializer serializer = new XmlSerializer(typeof(List<SimpleUser>));
using (XmlTextReader reader = new XmlTextReader(fileName))
{
    users = ((List<SimpleUser>)serializer.Deserialize(reader));
}

       记住,必须在创建序列化器的实例时告诉 XmlSerializer 要序列化和反序列化的类型。(引入 System.Xml 和 System.Xml.Serialization 会更方便)

 

       像 MembershipUser 这样的类不允许你访问某些信息(比如密码),你不能直接使用 XML 序列化它们。XML 序列化需要所有的属性和成员,它们都应以公共属性或者成员来存储。

       因此,需要创建自己的工具类代表用户和角色,以便用于后台的数据存储,它们只是简单的依赖于现存的 Membership 类。这个工具类将包含一些内部用户和 MembershipUser 类之间的映射逻辑。

       下图是这个自定义提供程序解决方案的总体设计:

       ASP.NET 自定义成员资格提供程序 Part.1(以 XML 存储为例,实现底层数据存储)

       SimpleUser 和 SimpleRole 使得 XML 序列化成为了可能,但需要一些逻辑映射支持 MembershipUser。

       UserStore 和 RoleStore 都是工具类,用来访问 XML 文件。它们加载和保存 XML 文件,并能进行一些搜索信息的基本功能。

       XmlMembershipProvider 继承了 MembershipProvider 的基本功能,而 XmlRoleProvider 继承了 RoleProvider 的基本功能。

 

 

2. 设计并实现自定义存储

       完成总体设计后,可以考虑底层的数据存储了。在这个例子中,数据存储包含用户和角色这 2 个 XML 文件。使用 XML 序列化作为首要的读写机制。因此,需要一些类以公共字段或者属性的形式持有将存储在 XML 文件里的数据。

class SimpleUser
{
    public Guid UserKey = Guid.Empty;
 
    public string UserName = "";
    public string Password = "";
 
    public string Email = "";
    public DateTime CreationDate = DateTime.Now;
    public DateTime LastActivityDate = DateTime.MinValue;
    public DateTime LastLoginDate = DateTime.MinValue;
    public DateTime LastPasswordChangeDate = DateTime.MinValue;
    public string PasswordQuestion = "";
    public string PasswordAnswer = "";
    public string Comment = "";
}
 
public class SimpleRole
{
    public string RoleName = "";
    public System.Collections.Specialized.StringCollection AssignedUsers
        = new System.Collections.Specialized.StringCollection();
}

相关文章:

  • 2021-12-22
  • 2021-11-09
  • 2021-06-15
  • 2022-02-26
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
  • 2021-09-24
猜你喜欢
  • 2021-12-05
  • 2022-02-13
  • 2021-07-11
  • 2022-12-23
  • 2021-11-05
  • 2021-10-07
  • 2021-12-17
相关资源
相似解决方案