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