通过使用ASP.NET应用程序(Membership)服务,可以轻松实现ASP.NET Web应用程序的认证需求。此服务数据库可以进行应用程序的路径管理,用户角色和认证信息(用户名、密码等)的管理,可以为用户存储自定义属性和个性化信息(Personalization,主要用于WebPart等信息的记录)。

一、创建数据库

1.新建数据库
  为R21项目创建R21.Authentication数据库。

2.向数据库追加ASP.NET应用程序(Membership)服务表
  使用控制台命令向数据库追加表。
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql -S [数据库实例] -U [数据库用户] -P [密码] -d R21.Authentication -A all 

  如果使用本地SQL Server Express数据库(VS2005和VS2008默认安装),数据库实例地址为.\sqlexpress。对于本地数据库可以使用Windows默认验证使用-E参数置换-U和-P参数组合,例如:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql -S .\sqlexpress -E -
d R21.Authentication -A all 


二、创建Web应用程序

1.创建R21.Web.App的Web应用程序

2.配置Web.config(这是比较复杂的部分,在稍后的文章中会对细节进行说明)

1) 设置<connectionStrings>元素,指定认证服务所需要的数据库。
将<connectionStrings/>元素内容更改为:
<connectionStrings>
  <clear/>
  <add name="LocalSqlServer" connectionString ="Data Source=[SQL Server实例];Initial Catalog=[认证服务数据库名];Persist Security Info=True;User ID=[用户名];Password=[密码];"/>
  </connectionStrings> 


2) 修改认证模式
将<authentication mode="Windows" />内容更改为:
<authentication mode="Forms" /> 


3) 指定Membership元素内容
向<System.Web>元素中追加Membership元素的配置内容,如下:
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
  <providers>
  <clear/>
  <add name="SqlProvider" 
  type="System.Web.Security.SqlMembershipProvider" 
  connectionStringName="LocalSqlServer"
  applicationName="/"
  enablePasswordRetrieval="true"
  enablePasswordReset="true"
  passwordFormat="Encrypted"
  requiresQuestionAndAnswer="false" />
  </providers>
  </membership>

因为我们使用的密码格式是加密格式(Encrypted,这种方式允许我们查询密码,但实际密码仍然使用加密字符串存储于数据库。),所以需要指定MachineKey元素以指定加密信息。即使使用者不打算使用加密格式我也建议大家追加MachineKey元素,因为当部署Web应用程序到复杂网络环境(如负载平衡或Web Farm)时会通过MachineKey来表示在不同物理部署的Web应用程序的一致性(当然前提是保持文件系统、应用程序名称和配置等的一致性)。
MachineKey的验证密钥对使用者来说是比较复杂的应用,可以通过在线MachineKey生成工具来生成,不建议大家拷贝微软和网上的例子,因为使用大家众所周知的密钥也是一种安全威胁。
MachineKey在线生成工具URL:[url]http://www.orcsweb.com/articles/aspnetmachinekey.aspx[/url]
我们将获得的MachineKey追加到<System.Web>元素中,如下:
<machineKey validationKey='20F482E86BE69CD5DF4408FFA817B53DF8BF04EFC9A6853C771C12CDC213F22EE8186385A77C1FD53C7D1E4421689267AF82318500C0C3B44BEF453360C9B9B0' decryptionKey='0795495273974A16A0F0F72940DDD4C85C4CE5DBCA2521C5' validation='SHA1'/> 


4) 指定Profile元素内容
向<System.Web>元素追加Profile内容:
<profile defaultProvider="SqlProvider">
  <providers>
  <clear />
  <add name="SqlProvider"
  type="System.Web.Profile.SqlProfileProvider"
  connectionStringName="LocalSqlServer"
  applicationName="/"
  description="SqlProfileProvider for SampleApplication" />
  </providers>

  <properties>
  <add name="Default" />
  </properties>
  </profile> 

Profile信息用来指定用户在Cookie中要记录的属性(properties元素),希望使用者默认情况下要指定一个属性(即使不使用),原因是如果没有属性就不会生成Cookie也就不会有认证信息被传递到服务器端。

三、用户管理

  我们可以使用Visual Studio 2005/2008提供的配置控制台进行用户的添加,也可以在页面上放置CreateUserWizard来实现。
  Visual Studio 2005/2008的ASP.NET配置控制台调用方法为在<解决方案浏览器>里选择ASP.NET Web应用程序项目,然后再菜单中选择[工程],在[工程]菜单的最下面就可以看到[ASP.NET配置...]选项,单击后就会弹出IE窗口打开ASP.NET配置控制台。
  在ASP.NET配置控制台中我们可以管理用户和角色,以及管理访问权限,访问权限是基于角色进行资源的管理。

四、Login控件

  使用ASP.NET Membership和Profile功能最强大的地方就是可以直接使用ASP.NET自带的Login控件进行用户操作,下面简单介绍如何实现登录和登出。

1) 创建登录页面
  创建登录页面Login.aspx并指定为ASP.NET Web应用程序的起始页。
  将Login控件拖拽到Login.aspx画面上,将DestinationPageUrl的值设为~/Default.aspx。
  以上操作意味着登录成功后跳转到Default.aspx页面。

2) 创建首页
  创建首页Default.aspx页面,将LoginName和LoginStatus拖拽到页面上。
  LoginStatus控件的LogoutAction属性值设置为Redirect,并将LogoutPageUrl设置为~/Login.aspx。