一、 引言
与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 2.0中,你可以通过使用ChangePassword控件来完成这项任务。
既然一个用户只有在登录后才能改变他们的口令,那么,你现在将要在你的应用程序(该程序仅为认证的用户所存取)中创建一新文件夹。
你可以添加一新文件夹到你的应用程序-通过右击解决方案资源管理器中的工程名,然后选择"Add Folder",再选择"Regular Folder"。命名文件夹为"Members"。现在,在该新文件夹上添加一新的表单(右击"Members",然后选择"Add New Item...")。命名该新建Web表单为ChangePassword.aspx(见图20)。
图20.这里显示的是在工程上增加文件夹后的解决方案资源管理器。
为限制到成员文件夹的存取,添加下列<location>元素到Web.config。
...
</system.web>
<location path="Members">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>
实质上,在成员文件夹中的页面只能为认证过的用户(所有的匿名用户(?)将被否认存取)所存取。
拖放ChangePassword控件到ChangePassword.aspx之上并且应用彩色模式(见图21)。
图21.ChangePassword控件:通过使用这个控件使你容易地实现让用户改变他们的口令。
为了测试该应用程序,在解决方案资源管理器的成员文件夹中选择ChangePassword.aspx文件并且按下F5键。你将首先被重定向到login.aspx页面(为了认证)并且一旦被认证,ChangePassword.aspx页面将被装载。现在,你可以改变你的口令了(见图22)。
图22.改变口令:用户在用ChangePassword控件改变口令时可能会看到这个屏幕序列。
四、 创建新用户
你需要设置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所示。
图19.恢复一丢失的口令:用户在恢复一个丢失的口令的过程中,会看到这个屏幕序列
为了安全原因,通过电子邮件发送口令给用户不是一个好注意。因此,你确实需要小心地考虑使用这一选择。
八、 改变口令
除了恢复失去的口令外,你还需要允许用户改变他们的口令。在ASP.NET 2.0中,你可以通过使用ChangePassword控件来完成这项任务。
既然一个用户只有在登录后才能改变他们的口令,那么,你现在将要在你的应用程序(该程序仅为认证的用户所存取)中创建一新文件夹。
你可以添加一新文件夹到你的应用程序-通过右击解决方案资源管理器中的工程名,然后选择"Add Folder",再选择"Regular Folder"。命名文件夹为"Members"。现在,在该新文件夹上添加一新的表单(右击"Members",然后选择"Add New Item...")。命名该新建Web表单为ChangePassword.aspx(见图20)。
图20.这里显示的是在工程上增加文件夹后的解决方案资源管理器。
为限制到成员文件夹的存取,添加下列<location>元素到Web.config。
...
</system.web>
<location path="Members">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>
实质上,在成员文件夹中的页面只能为认证过的用户(所有的匿名用户(?)将被否认存取)所存取。
拖放ChangePassword控件到ChangePassword.aspx之上并且应用彩色模式(见图21)。
图21.ChangePassword控件:通过使用这个控件使你容易地实现让用户改变他们的口令。
为了测试该应用程序,在解决方案资源管理器的成员文件夹中选择ChangePassword.aspx文件并且按下F5键。你将首先被重定向到login.aspx页面(为了认证)并且一旦被认证,ChangePassword.aspx页面将被装载。现在,你可以改变你的口令了(见图22)。
图22.改变口令:用户在用ChangePassword控件改变口令时可能会看到这个屏幕序列。