3.2 ASP.NET 2.0附带的提供程序
ASP.NET 2.0附带的几个特性实现并利用了提供程序模型的概念。大多数特性都实现了在数据库中提取和存储数据的功能。例如,MembershipProvider类建立了用于管理用户的契约。与其他几个提供程序一样,ASP.NET 2.0附带的控件使用在应用程序中配置的MembershipProvider。这些控件能工作的原因是,它们可以依赖已配置的提供程序,执行在MembershipProvider上定义的一组固定方法。
与ProviderBase一样,MembershipProvider类也是一个抽象类,仅为成员管理提供了契约或方法/属性定义。为了使它可用,ASP.NET小组提供了SqlMembershipProvider,它继承自MembershipProvider,提供了MembershipProvider契约的具体实现方式。在下面的例子中,ASP.NET使用web.config或machine.config中的配置信息,确定哪个MembershipProvider是激活的,以标识和加载相应的提供程序。如果查看machine.config文件,搜索membership,就会找到MembershipProvider的默认配置。下面的示例是MemberShipProvider的machine.config文件的默认内容:
<system.web>
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer" enablePasswordRetrieval="false"
enablePasswordReset="true" requiresQuestionAndAnswer="true"
applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
</system.web>
这个配置项告诉ASP.NET有一个 SqlMembershipProvider类,并把各种设置传送给提供程序,以控制提供程序的操作方式。该例子的目的不是研究传送给提供程序的各个参数,而是揭密成员提供程序如何使用默认的安装。这些参数都可以在应用程序的本地web.config文件中修改,MSDN文档提供了其可能设置的详细信息。本章的后面将讨论在建立自己的提供程序时,如何访问这些设置。
在其他内置提供程序模型的machine.config文件中,也有类似的配置项,它们由ASP.NET中的特性支持。
表3-2列出了ASP.NET的内置提供程序模型的特性及其实现方式。
表 3-2
提供程序的类型 | 说 明 |
Membership | 管理用户,在System.Web.Security命名空间中有两个提供程序:SqlMembershipProvider和ActiveDirectoryMembershipProvider |
Role | 管理与用户相关的角色,在System.Web.Security命名空间中有三个内置的提供程序: AuthorizationStoreRoleProvider、SqlRoleProvider和WindowsTokenRoleProvider |
Site Map | 用于填充站点地图控件,只有一个内置的提供程序:System.Web. XmlSiteMapProvider |
Session State | 可以管理站点用户的会话状态—— 提供程序匹配和提供的功能类似于ASP.NET 1.1。但是,现在用户可以扩展它,或用自己的会话状态提供程序来替代它。会话状态提供程序位于System.Web.SessionState命名空间中,InProcSessionStateStore、OutOfProcSessionStateStore和SqlSessionStateStore实现了会话状态提供程序 |
Profile | System.Web.Profile.SqlProfileProvider 提供了一种SQL Server实现方式,来存储用户配置项。将来的配置提供程序可以把正常的数据库表映射为配置项 |
Web Event | Web事件提供程序可以扩展或发布Web事件,它位于System.Web. Management命名空间。下面是内置的提供程序: EventLogWebEventProvider、SimpleMailWebEventProvider、TemplateMailWebEventProvider、SqlWebEventProvider、TraceWebEventProvider和WmiWebEventProvider |
Web Part | 为Web part保存位置和其他个性化选项,Web part位于System.Web. UI.WebControls.WebParts命名空间,SqlPersonalizationProvider是其唯一的内置提供程序 |
Protected Configuration | 在应用程序配置文件中提供各个配置段的保护,有两个内置的提供程序: DPAPIProtectedConfigurationProvider和RSAProtectedConfigurationProvider |
在开始讨论如何建立自己的提供程序,扩展内置的提供程序之前,先考虑一个比较常见的问题:如何让应用程序不使用本地的SQLExpress实例?在前面的MembershipProvider配置示例中,连接字符串LocalSqlServer有一项。快速扫描machine.config文件,也可以看到其定义,如下所示:
<connectionStrings>
<add name="LocalSqlServer" connectionString="data
source=.\SQLEXPRESS;Integrated
Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User
Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
注意,这会影响ASP.NET附带的提供程序的所有SQL Server实现方式,所以改变它,会改变使用SQL Server版本的所有提供程序,除非修改它们的配置段,指定另一个connectionStringName。
如果要指定另一个SQL Server实例,只需清除现有的连接,或删除它,再添加自己的连接,如下所示:
<connectionStrings>
<clear/>
<add name="LocalSqlServer" connectionString="Data
Source=ctcdev2;Initial Catalog=MyDB;Integrated Security=True”
providerName="System.Data.SqlClient" />
</connectionStrings>
要完成的另一个工作是对已有的数据库使用内置的提供程序。在.NET Framework 2.0的安装目录中有一个实用程序aspnet_regsql.exe,它会建立必要的数据库表和存储过程,来支持所有提供程序的内置SQL版本。