ASP.NET 1.x中的窗体验证(forms-based authentication)提供了一个标准的方法来支持authentication ticket,来在不同页面请求之间记住用户登录状态。但它没有提供任何帮助来完成储存用户帐户信息和创建必须的页面(登录,创建用户等)。ASP.NET 2.0中完成了1.x中窗体验证(forms-based authentication)未完成的最后一步,它支持编程方式验证、添加、创建、删除和修改用户帐户信息,更提供了Web 控件来帮助完成这些任务。2.0同样支持1.x版本中的窗体验证,像通过在web.config文件来进行授权配置。但2.0增加了membership这个API和web安全控件。
membership API是使用provider模型来实现的,这意味着只要接口定义恰当,具体的实现是可以定制的。.NET框架包含的Membership类包含了像CreateUser()、GetAllUsers()、ValidateUser()、DeleteUser()等方法。但在使用这个API的时候真正被web应用程序调用的类是由程序的配置决定的。你可以通过创建一个实现了membershipAPI的类来实现自己的用户帐户逻辑,通过配置应用到web应用程序中。当然,你并不需要自定义一个类-ASP.NET内置了两个membership provider,一个用SQL Server数据库来存放用户帐户信息,另一个使用活动目录(Active Directory)。你可以使用其中之一,如果你已经自定义了用户信息,那么你可以创建一个定制的provider来使整个用户仓库无缝地应用同样的API和安全控件(更多信息参看A Look at ASP.NET 2.0’S Provider Model)。
SqlMembershipProvider-把用户帐户数据保存到SQL Server数据库
为了使用这个提供器,必须先创建要用到的数据库模式。有两种方法:
1. 使用ASP.NET网站管理工具(Website Administration Tool),这种方法会在App_Data目录创建一个SQL Server 2005 数据库文件:ASPNETDB.mdf。
2. 使用ASP.NET的SQL Server注册命令行工具(aspnet_regsql.exe),适用于SQL Server 2000和2005。
使用网站管理工具,首先在Visual Studio中打开一个网站,在“网站”(Website)菜单选择“ASP.NET配置”(这样会打开一个新的网页)。进入“安全”标签页,把验证类型改成“从互联网”(From the internet)。这样就会在App_Data目录创建一个ASPNETDB.mdf的文件。你也可以使用网站管理工具来指定授权设置(更多信息参考:Website Administration Tool Overview)。
当你把验证类型改成“从互联网”之后,web.config文件会出现这样一行:
view plainprint?
<authentication mode=”Forms”/>
如果你使用SQL Server注册工具来创建数据库,则需要手动添加这一行到web.config。另外如果你更改了ASPNETDB.mdf所在目录,那么你需要在web.config指定数据库连接字符串。
SQL Server注册工具(aspnet_regsql.exe)是图形界面的,向导会让你指定把数据表放到哪里。(更多信息参看:technical documentation)。
SqlMembershipProvider用两个相关的数据表来存储用户帐户信息:
aspnet_Users: 每个用户一条记录。仅有必须的一些字段,其中UserId字段存放用户的唯一标识(uniqueidentifier-GUID)。
aspnet_Membership: 记录通过UserId字段绑定到aspnet_Users的对应记录。这个表保存帐户的相关信息如Email、密码、安全问题与答案等。
定制SqlMembershipProvider
如果你使用默认的配置,除了指定使用窗体验证和添加授权规则(可以手动或者用网站管理工具,语法和1.x一致)外,你不需要改动web.config文件的其它部分(更多信息可参见:Authentication and Autorization, Authorizing Users and Roles)。
但如果你使用不同的数据库,或者改变会员设定(像email地址是否必须唯一,最小密码长度,密码加密方式,安全问题是否必须等)。你必须在web.config中手动加入一个XML块。注意,你应该指定一个硬编码的“applicationName”属性(更多信息参见Always set the “applicationName” property when configuring ASP.NET 2.0 Membership and other Providers)。
下面的XML块是一个示例。<membership>部分是定制的设置。
view plainprint?
<configuration>
<connectionStrings>
<add name="MyDB" connectionString="..." />
</connectionStrings>
<system.web>
... authentication & authorization settings ...
<membership defaultProvider="CustomizedProvider">
<providers>
<add name="CustomizedProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="MyDB"
applicationName="ScottsProject"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0" />
</providers>
</membership>
</system.web>
</configuration>
在<membership>标记里面指定“CustomizedProvider”为默认的membership provider。这个定制的provider还是使用SqlMembershipProvider,它只是把connectionStringName改成MyDB,把applicationName改成ScottsProject,把minRequiredPaswordLength设为5,把minRequiredNonalphanumericCharacters设为0(更多可定制的标签可参看: <add> Element for Providers for Membership)。
用网站管理工具来管理用户:一旦你配置了网站来使用membership系统,你就可以用网站管理工具来管理用户。在“安全”标签页创建用户,分配角色等。
安全网页控件(Security Web Controls)概要
ASP.NET 2.0在1.x的基础上增加了一些网页控件,有7个安全网页控件,它们提供用户帐户相关操作的用户界面。这些控件的底层都使用membership system。如果你自定义了一个membership provider,你一样可以使用它们。
这7个控件是:
1. Login,示例如下:
2. LoginView-是一个页面可以根据用户是否登录显示不同内容。包括两个模板(template): AnonymousTemplate和LoggedInTemplate。只需要在着两个模板里指定不同的内容来显示。
3. PasswordRecovery-允许用户通过邮箱来取回密码。如果密码是哈希加密的,那么用户会收到一个随机的新密码,如果密码是明文的或者(可逆)加密的,那么用户会收到密码原文。
4. LoginStatus-这个简单的控件仅在页面显示“登入”和“登出”链接,区别于当前用户是否已经登录。
5. LoginName-这个控件仅仅显示当前登录用户的用户名(username)。当前登录用户的用户名也可以通过代码取得(User.Identity.Name)。
6. CreateUserWizard-这个控件提供了创建用户的界面。示例如下:
如何自定义这个控件的布局请参看:Customizing the CreateUserWizard Control。
7. ChangePassword-更改密码。
全部这些控件可以不写一行代码就使用。如创建一个登录页面仅仅需要创建一个Login.aspx页面,然后把Login控件拖进页面。这篇文章末尾的下载包含一些演示怎样使用某些控件的页面。我们会在接下来的系列里详细讨论细节问题。
by Evan www.cnevan.com
membership system只是ASP.NET 2.0中用户帐户的一部分。还有roles system, profile system来提供基于角色的验证的支持。这些支持使得我们不用编写任何代码和创建任何数据表。在接下来的系列文章中,我们将讨论这些系统和安全网页控件的用法。
Happy Programming!