15.2 通过基于属性的编程改变提供程序的行为
要修改.NET Framework 2.0内置的提供程序的行为,最简单的方式是通过基于属性的编程。在ASP.NET 2.0中,可以通过使用属性,修改相当高级的行为。可以在各个应用程序配置文件中应用服务器控件和设置。使用machine.config文件或web.config根文件中的提供程序定义,可以改变提供程序的行为。本章将举例说明如何修改SqlMembership Provider。
15.2.1 通过SqlMembershipProvider建立简单的密码结构
在用SqlMembershipProvider实例创建用户时,无论是使用SQL Server Express,还是Microsoft SQL Server 2000/2005,都要注意创建用户所需的密码是一个半强类型化的密码。在通过ASP.NET Web Site Administration工具创建用户时,这是非常明显的,如图15-2所示。
在这个屏幕上尝试输入一个密码,但屏幕提示,该密码不满足要求。密码的最小长度是7个字符,而且其中至少有一个非数字和字母的字符。也就是说,需要输入像“Buubles!”这样的密码。这类行为是由成员提供程序指定的,不是由成员系统中使用的控件或API指定的。该要求的定义在C:\WINDOWS\Microsoft .NET\Framework\v2.0.50727\CONFIG下的machine.config.comments文件中。这个定义如程序清单15-1所示。

图 15-2
程序清单15-1 SqlMembershipProvider实例声明
<configuration>
<system.web>
<membership defaultProvider="AspNetSqlMembershipProvider"
userIsOnlineTimeWindow="15" hashAlgorithmType="" >
<providers>
<clear />
<add connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</membership>
</system.web>
</configuration>
下面看看这个提供程序的属性,注意minRequiredPasswordLength和minRequired NonalphanumericCharacters属性定义了上述行为。要在服务器上的每个应用程序中改变该行为,只需修改这个文件中的这些值。但建议在各应用程序的web.config文件中修改这些值,如程序清单15-2所示。
程序清单15-2 在web.config文件中修改属性值
<configuration>
<system.web>
<authentication mode="Forms" />
<membership>
<providers>
<clear />
<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"
requiresQuniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="4"
minRequiredNomalphanumricCharacters="0"
passwordAttemptWindow="10"/>
</providers>
</membership>
</system.web>
</configuration>
在这个例子中,通过minRequiredPasswordLength和minRequiredNonalphanumeric Characters属性改变了密码的要求。密码允许的最小长度是4个字符,且这些字符都是数字或字母(特殊字符包括!、$、#等)。
在应用程序的web.config文件中重新定义提供程序是一个相当简单的过程。在程序清单15-2中,<membership>元素非常类似于machine.config文件中的<membership>元素。
在定义自己的SqlMembershipProvider实例时,有两个选择。一个选择如程序清单15-2所示,重新定义machine.config文件中的SqlMembershipProvider实例(AspNetSqlMembership Provider,其值来自于提供程序声明中的name属性)。如果采用这个选项,就必须清理以前定义的AspNetSqlMembershipProvider实例,在<providers>段中用<clear />节点重新定义AspNetSqlMembershipProvider。否则会抛出一个错误,说明这个提供程序名已经定义过了。
在清理了以前定义的AspNetSqlMembershipProvider实例后,用<add>元素重新定义这个提供程序。在程序清单15-2中,用minRequiredPasswordLength和minRequired Nonalphanumeric Characters属性的新值(显示为黑体)重新定义了密码的要求。
在定义自己的SqlMembershipProvider实例时,另一个选择是为<add>元素中的提供程序指定新的name属性值。如果采用这种方法,就必须使用defaultProvider属性,把这个新命名的实例指定为成员系统的默认提供程序。该方法如程序清单15-3所示。
程序清单15-3 定义自己的SqlMembershipProvider实例
<membership defaultProvider= "MyVeryOwnAspNetSqlMembershipProvider" >
<providers>
<add name = "MyVeryOwnAspNetSqlMembershipProvider"
type = "System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0, Culture = neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName = "LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresQuniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="4"
minRequiredNomalphanumricCharacters="0"
passwordAttemptWindow="10"/>
</providers>
</membership>
在这个例子中,machine.config文件中的SqlMembershipProvider实例(用AspNetSql MembershipProvider名称定义)没有重新定义。而是在web.config文件中定义了一个新名称的实例MyVeryOwnAspNetSqlMembershipProvider。
15.2.2 通过SqlMembershipProvider建立强类型的密码结构
下面介绍如何使密码的结构更复杂。当然,完成这个任务有两种方式。一种是使用前面介绍的minRequiredPasswordLength和minRequiredNonalphanumericCharacters属性,使密码达到需要的长度(较长的密码一般比较安全),并包含指定数量的非数字字母的字符(这也会增加安全性)。
另一种方式是使用passwordStrengthRegularExpression属性。如果minRequiredPassword Length和minRequiredNonalphanumericCharacters属性不能提供需要的密码结构,最好使用passwordStrengthRegularExpression属性。
下面是使用这个属性的一个示例。假定要求用户的密码是他的U.S.社会安全号。因此可以把提供程序定义为如程序清单15-4所示。
程序清单15-4 web.config文件中改变密码结构的提供程序实例
<configuration>
<system.web>
<authentication mode="Forms" />
<membership>
<providers>
<clear />
<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"
requiresQuniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="\d{3}-\d{2}-\d{4}" />
</providers>
</membership>
</system.web>
</configuration>
这里没有使用minRequiredPasswordLength和minRequiredNonalphanumericCharacters属性,而使用了passwordStrengthRegularExpression属性,其值是\d{3}-\d{2}-\d{4}。这个正则表达式表示,密码应包含3个数字,后跟一个短横线,然后是两个数字、一个短横线,最后是4个数字。
这说明,有许多方式可以修改.NET Framework 2.0默认安装中已有的提供程序的行为。可以调整内置于框架中的许多提供程序,使用基于属性的编程方式,使它们满足自己的要求。SqlMembershipProvider示例就演示了该过程,对其他提供程序也可以进行类似的修改。







