转自:http://blog.csdn.net/lubosun/archive/2007/03/01/1517926.aspx
http://msdn.microsoft.com/library/en-us/dnpag2/html/PAGHT000022.asp 摘要: 本文介绍了怎么在ASP.NET 2.0中使用Membership新特性,并且介绍了怎么两种不同的Membership的Provider:ActiveDirectoryMembershipProvider和SqlMembershipProvider,前者是基于微软活动目录服务存储用户信息的,或者是基于SQL SERVER存储的。2.0中的这个新机制大大减少了站点用户认证模块的代码量。 目录: 学习目的 使用ActiveDirectoryMembershipProvider 使用SqlMembershipProvider ActiveDirectoryMembershipProvider的一些设置参数 SqlMembershipProvider的一些设置参数 Membership 的一些API 学习目的: 学会使用Membership进行表单认证 学会设置ActiveDirectoryMembershipProvider 学会使用ActiveDirectoryMembershipProvider建立认证用户 学会设置SqlMembershipProvider 学会建立SQL SERVER Membership数据库 学会使用SqlMembershipProvider建立认证用户 使用ActiveDirectoryMembershipProvider 如果用户信息是存储在活动目录中,而你的内网程序又因为防火墙或者需要适应不同的浏览器等原因不能使用windows集成认证的话,这个时候你可以选择使用ActiveDirectoryMembershipProvider实现表单认证 基本的步骤如下 按照以下步骤来用ActiveDirectoryMembershipProvider实现asp.net程序的用户表单认证 1、配置表单认证 2、配置ActiveDirectoryMembershipProvider 3、建立用户 4、认证用户 1、配置表单认证 要实现表单认证需要设置<authentication>的mode属性为"Forms",然后按照下面的例子配置web.config文件 <authentication mode="Forms">
<forms loginUrl="Login.aspx"
protection="All"
timeout="30"
name="AppNameCookie"
path="/FormsAuth"
requireSSL="false"
slidingExpiration="true"
defaultUrl="default.aspx"
cookieless="UseCookies"
enableCrossAppRedirects="false"/>
</authentication>
·
loginUrl
指向登录页面,你需要把它放在支持SSL的目录下 ·
Protection 设置成"All"表示为认证凭据同时启用数据来源验证和加密 ·
Timeout 指定了认证的生存时间 ·
name and path are set to unique values for the current application. ·
requireSSL 设置成"false"表示关闭cookie的SSL加密 ·
slidingExpiration 如果设置成"true"的话,每次访问过期时间将会重置 ·
defaultUrl 就是设置程序的首页 ·
cookieless
设置成"UseCookies"表示使用cookie来传递认证票据 ·
enableCrossAppRedirects 设置成"false"表示程序不接受外部的请求 按照下面的例子为<authentication> 增加<authorization>块,表明只有登录过的用户才能进入程序否则会被转到前面loginUrl设置的页面 <authorization>
<deny users="?" />
<allow users="*" />
</authorization>
2、配置ActiveDirectoryMembershipProvider 按照下面的例子配置ActiveDirectoryMembershipProvider <connectionStrings>
<add name="ADConnectionString"
connectionString=
"LDAP://domain.testing.com/CN=Users,DC=domain,DC=testing,DC=com" />
</connectionStrings>
<system.web>
...
<membership defaultProvider="MembershipADProvider">
<providers>
<add
name="MembershipADProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connecti
c
c/>
</providers>
</membership>
...
</system.web>
前面的代码为<providers>添加<add>子节点来为membership指定ActiveDirectoryMembershipProvider,活动目录中存储用户信息的连接字符串如下格式LDAP:// server/userdn, ·
server 是活动目录服务器的IP或者名字 ·
userdn 是活动目录的DN,格式是/CN=Users然后是逗号加上逗号分割开的域名,比如域名是domain.testing.com,连接字符串就是LDAP://domain.testing.com/CN=Users,DC=domain,DC=testing,DC=com
注意:确保<membership>的defaultProvider属性设置成了你的ActiveDirectoryMembershipProvider(在这个例子中是MembershipADProvider),如果需要为机器级别改变这个属性,%windir%\Microsoft.NET\Framework\{Version}\Config\machine.config文件中改写原有的AspNetSqlMembershipProvider,AspNetSqlMembershipProvider是使用SQLMembershipProvider在\app_data目录中的SQL Server Express数据库来存放用户信息的机制 3、建立用户 可以使用下面的几种方法新建用户 ·
打开vs.net2005的Website菜单,点击ASP.NET Configuration,然后在安全里面进行设置 ·
建立一个ASP.NET页面,放入一个CreateUserWizard控件,这个控件使用配置过的membership provider来实现建立用户的过程 ·
手动拖放填写用户名和密码的文本框然后使用Membership API的CreateUser方法来实现
注意:其实所有这些方法最终还是使用Membership.CreateUser来建立用户 默认配置的ActiveDirectoryMembershipProvider使用UPNs来进行名字印象,如下 attributeMapUsername="userPrincipalName" 因为所有用户名都需要按照下面的格式: UserName@DomainName 如果手动使用Membership.CreateUser方法来创建用户,这么做 Membership.CreateUser("UserName@DomainName", "P@ssw0rd", "userName@emailAddress");
你也能设置config文件来改变映象方式: attributeMapUsername="sAMAccountName" 如果这样设置的话,用户名就如下格式: UserName 这样建立用户: Membership.CreateUser("UserName", "P@ssw0rd", "userName@emailAddress") 注意:你可以设置requiresUniqueEmail为"true"来确保所有用户的mail地址不重复 4、认证用户 要认证用户,你必须要建立一个登录页面,而它也就是唯一不需要验证的页面 可以使用以下方法建立登录页面: l
用ASP.NET 2.0登录控件,这个控件几乎包含了所有涉及到的操作,它会自动连接配置过的membership provider,不需要写任何代码,登录以后控件可以保存用户信息,比如用加密过的cookie保存。 l
当然你也可以手动来用文本框完成这个过程,可以利用Membership
的ValidateUser来判断登录情况,登录完成后你还需要用FormsAuthentication类来为用户的浏览器写入cookie,下面是例子:
if (Membership.ValidateUser(userName.Text, password.Text)) {
if (Request.QueryString["ReturnUrl"] != null)
{
FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
}
else
{
FormsAuthentication.SetAuthCookie(userName.Text, false);
}
} else {
Response.Write("Invalid UserID and Password");
}
注意:上面两种方式都是使用Membership.CreateUser方法 bool isValidUser = Membership.ValidateUser("UseName@DomainName", "P@ssw0rd");
attributeMapUsername="sAMAccountName"
bool isValidUser = Membership.ValidateUser("UserName", "P@ssw0rd", "userName@emailAddress")
|