一、 引言
与ASP.NET 2.0一同上市的有几个新的安全控件-它们位于工具的Login选项卡中(见图1)-这些控件大大简化了Web开发人员的工作。通过使用这些新的安全控件,现在你可以执行例如用户登录、注册、口令改变等的任务;而且,为此做出的努力仅是拖放相应的控件到你的Web表单上去。在本文中,我将向你展示怎样使用这些新控件来实现用户认证。
首先,让我们探索一下LoginView、LoginStatus和LoginName三个控件的使用。首先,让我们使用Visual Studio 2005 Beta 2构建一个Web工程。启动Visual Studio IDE,然后从文件菜单中点击"New Web Site"以创建一个新的Web工程,并命名工程为"C:\SecurityControls"。
在Default.aspx Web表单上,拖放并加入一个LoginView控件。该LoginView控件是一个容器控件-用于根据用户是否已登录显示不同的信息。
首先,我们用文本填充LoginView控件,如图2所示。然后,把Login控件拖拽到LoginView控件上。在用户还没有被认证(匿名)之前,你刚输入的文本将被显示。该Login控件显示一个链接以允许用户被重定向到另一个页面以登录到应用程序。
在LoginView控件的"Smart Tasks"菜单上,把视图改变为"LoggedInTemplate"(见图3)。
随后改变视图,把在图4中显示的文本输入到LoginView控件。一旦用户被认证该文本即被显示。然后,把LoginName控件拖放到LoginView控件之中。该LoginName控件将显示用于登录到应用程序的用户名。
图1.该图显示ASP.NET 2.0中新型安全控件。 图2.图显示填充LoginView控件的过程。
图3.你可以改变LoginView控件的显示形式。 图4.在用户被认证后该文本显示出来。
二、 使用Login控件
现在让我们添加一新的Web表单到该工程(在解决方案资源管理器中右击工程名称并且选择"Add New Item...")并且命名为Login.aspx。你的应用程序将使用这个表单来允许用户登录到该应用程序。
注意,在ASP.NET 2.0中,默认登录页面命名为Login.aspx(这是被默认加入到ASP.NET 2.0中的并可以通过查看machine.config.comments进行校验)。
然而,如果你确实想为你的登录页面使用一不同的命名,你可以通过增加下列的几行来修改Web.config文件。你可以改变认证方式-从缺省的Login.aspx改变为Authenticate.aspx:
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH"
loginUrl="Authenticate.aspx"
protection="Validation" timeout="999999" />
</authentication>
...
图5.应用AutoFormat:这是一种应用格式到Login控件的方法。
图6.增加一个模式:这是在应用彩色模式后的Login控件样式。
把Login控件拖到Login.aspx上。你可以应用格式到Login控件以使它看起来更专业化。点击Login控件的"Smart"标签并且选择"Auto Format..."链接(见图5)。
选择彩色模式之后,Login控件应该看上去如图6所示。
默认情况下,ASP.NET 2.0使用Windows认证-如果你针对互联网用户那么这种方式不够灵活。因此,你应该把认证方式从默认的Windows方式改变到表单认证方式。
添加一个Web.config文件到你的工程(在工程名字上单击右键,在解决方案资源管理器中并选择"Add New Item.... ",从可用的列表选项中选择"Web Configuration File")。
在Web.config中,通过增加下列的几行代码,从Windows认证方式改变到表单认证方式。你使用表单认证,这样你可以添加用户到你的Web站点而不需要在Windows下创建新的用户帐户。
<system.web>
<authentication mode="Forms"/>
...
三、 把一新用户添加到你的应用程序
在你继续测试该应用程序之前,你需要为该应用程序创建一新用户。你可以使用ASP.NET Web站点管理工具(WAT)来添加一新用户到你的应用程序。为了激活WAT,选择"Website",然后选择"ASP.NET Configuration"(见图7)。
图7.Web站点管理:该图显示怎样激活WAT
该WAT将被显示在一新的网页中。点击"Security"链接跳转到"Security"选项卡(见图8)。
图8.WAT:这里显示出WAT的用户接口。
这个"Security"选项卡允许你执行任务-例如创造并删除用户,以及为你的应用程序创建角色和存取规则。点击"Create user"链接以添加一新用户到你的应用程序(见图9)。
图9.WAT安全:选择WAT中的"Security"选项卡能够让你管理安全特性
为该新建用户帐户提供必需的信息(见图10)。注意,这里的口令必须是数字、字母和特殊的字符的结合。请确保至少为该口令提供7个字符。点击"Create User"以添加一个新用户。
图10.增加用户:该图显示出WAT安全屏幕,在此你可以添加新的用户帐户。
现在你已准备好测试该应用程序了。在解决方案资源管理器中选择Default.aspx,然后按下F5键。点击"Login"链接以登录到应用程序中,然后输入帐户信息。当你成功地登录到应用程序时,"Login"链接改变为"Logout"。图11显示出这些事件顺序。
图11.登录:这三个屏幕显示在用户登录到应用程序时的完整过程。
四、 创建新用户
你需要设置CreateUserWizard控件的ContinueDestinationPageURL属性,这样在用户点击"Continue"按钮时,它就能够被重定向到另一个页面,如一个欢迎页面。
除了为用户创建用户帐户外,你也可以允许用户为自己创建新帐户。这在有些场所下很有用-为了存取你的应用程序,例如在一个讨论论坛,你允许用户创建自由帐户。
为了允许用户创建新帐户,可以使用CreateUserWizard控件。把CreateUserWizard控件拖放到Default.aspx并应用彩色模式。该控件看去应该如图12所示。
图12.CreateUserWizard控件:这个控件让用户创建他们自己的新用户帐户。
为测试应用程序,可以按下键F5。现在你自己可以创建一个新的用户帐户(见图13)。提供必要的信息并点击"Create User"。
五、 用户信息的存储位置
到目前为止,你已经看到了怎样使用WAT和CreateUserWizard控件来创建用户。你可能想知道这个信息被存储在哪儿。如果你现在查看解决方案资源管理器并且刷新App_Data文件夹(右键点击它并且选择刷新文件夹),你就会看到一个名为ASPNETDB.MDF的项(见图13)。
图13.你将在解决方案资源管理器的此处找到ASPNETDB.MDF数据库文件。
图14.自动创建的用户:该图显示出一个用户创建一新的用户帐户。
在用户创建成功后,你会看到如图15所示的屏幕。
图14.创建帐户:在创建一新帐户后,用户会看到此屏幕。
这个ASPNETDB.MDF是一个SQL Server 2005速递数据库-默认地,ASP.NET 2.0使用之来存储应用程序相关的数据例如用户帐户、配置,等等。为了分析这个数据库,双击它则你会看到它的内容显示在Database Explorer中(见图16)。具体地说,aspnet_Membership和aspnet_Users表格将用来存储你在前面创建的用户帐户信息。为了观看表格的内容,只须右击表格名字并选择"Show Table Data"。
图16.数据库ASPNETDB.MDF:你可以在Database Explorer格子中探索ASPNETDB.MDF数据库。
ASP.NET 2.0的一个很好的特点是不必要创建定制的数据库来存储你的用户的信息。并且你甚至不需要担心把用户的口令进行散列化处理来安全地存储它们。ASP.NET 2.0自动地为你做这件事情。
六、 会员供给者模型工作原理
ASP.NET 2.0使用一种新型的安全模型,称为会员供给者模型。这个模型通过使开发者能够选择添加安全特性到他们的应用程序的方式来允许最大程度的灵活性和扩展性。
作为这个供给者模型扩展性的一个实例,请考虑一下新的安全(登录)控件-你已在本文中看到过。这些控件、API以及构成该新模型的供给者显示于下图中。
图会员供给者模型:该图显示了本文所讨论的控件和会员供给者模型的各个层之间的关系。
在最顶层上是各种的Web服务器控件,例如Login、LoginStatus和LoginView控件。在该控件下面是API-它们执行要求其完成的任务。Membership类负责处理如添加和删除用户等的任务,而MembershipUser类负责管理用户的信息如口令、口令问题,等等。这些会员API使用会员供给者来保存或进行持续性存储。Visual Studio 2005与一个缺省的会员供给者一同发行-SQL Server 2005 Express Membership Provider。会员供给者的角色是充当会员API和数据存储之间的桥梁,以便信息能够被持续性存储而不需要开发者编写低层代码来存取数据。
如果微软提供的供给者不能满足你的需要,你或者可以扩展它们或者编写你自己的。例如,如果你想要用一个XML文档而不是一个关系数据库(例如SQLServer)来保存你的站点的会员信息,你可以编写你自己的供给者来实现与XML文件的对话。
七、 恢复丢失的口令
恢复/清除丢失的口令是你-作为一个管理员需要执行的一项普通任务。PasswordRecovery控件允许用户自己执行这项普通任务-通过自动地检索口令然后用电子邮件把它发送给用户。
仅在你以普通文本存储口令而不是对口令的散列值进行存储时,口令恢复才是重要的。然而,默认情况下,在machine.config文件中的设置指定所有的口令,在把它们存储到成员数据库之前,要被散列化处理。Machine.config默认情况下也不允许口令恢复。
为了在普通文本中存储用户口令,你可以在文件Web.config中添加下列入口:
...
<system.web>
<membership
defaultProvider="SqlProvider"
userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
applicationName="SecurityControls"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="true"
passwordFormat="Clear" />
</providers>
</membership>
...
具体地说,你现在清除了所有的会员供给者,然后添加一个新的SqlMembershipProvider。注意,为了允许口令检索,你需要设置enablePasswordRetrieval(为真)和passwordFormat(清除之)属性。
如果你设置了passwordFormat为散列化的,那么你必须把enablePasswordReset设置成假。
现在拖动PasswordRecovery控件到Default.aspx,然后应用彩色模式。该PasswordRecovery控件现在看起来象图17。
图17.PasswordRecovery控件。通过使用这个控件,用户能够恢复他们忘记的口令。
在PasswordRecovery控件的属性窗口中,设置MailDefinition属性下的"From"和"Subject"字段,如图18所示。
图18.PasswordRecovery控件属性:如何在属性浏览器中,配置你的PasswordRecovery控件
另外,你需要在你的机器上配置好SMTP服务,以便用PasswordRecovery控件来发送一电子邮件。为在你的机器上配置该SMTP服务,启动WAT,选择应用程序,然后选择配置SMTP电子邮件设置。
为测试应用程序,按下F5键。你将被提示输入你的用户名,然后是你的安全问题。如果该安全问题的答案是正确的,那么口令将被以电子邮件形式发送给你;否则,在该页面将显示给你一错误消息,如图19所示。