Asp.net的membership提供了一种存储,验证和管理用户信息以及权限的统一的路径。membership所对应的验证方式是asp.net的Forms身份验证(注:asp.net的身份验证方式 有好几种包括windows身份验证 Forms身份验证 Passport身份认证当然还有就是没有验证)。在vs2005中 还给membership提供了一系列的控件(login控件),能方便的在asp.net实现membership。
membership能实现的功能:
1. 创建用户
2. 可以保存membership信息在sql server,Active Directory以及其他的一些数据保存方法
3. 鉴别谁在访问你的网站。如果使用login控件,几乎可以在不写代码的情况下完成。
4. 管理密码。包括 创建 修改 重置
5. 创建一个唯一的值来标志每一个登陆用户,可以实现对用户的个性化以及角色管理。
6. 提供一个用户自定义的membership provider,从而实现一些自己网站特有的数据的保存和管理。
membership的使用:
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.安装membership数据库
在使用SqlMembershipProvider以前需要安装一个membership数据库,使用一个SQL SERVER管理员权限登录到服务器,然后在Visual Studio 2005命令行模式下执行下面的语句
aspnet_regsql.exe -E -S localhost -A m
看下几个参数:
-E 表明此帐号使用windows集成认证
-S 表明需要安装数据库的服务器名
-A m 表明自动为membership建立相应的表和存储过程
注意:Aspnet_regsql 工具同样为其他ASP.NET 2.0特性安装数据库,比如说成员管理,Profile,个性化Web Parts还有Web Events等,当然都会有其他的命令,如果你不使用任何参数的话可以以想到模式运行程序,会允许你在安装的过程中指定数据库服务器和你需要安装的组件
3、配置SqlMembershipProvider
Machine.config其实默认就是使用SQL Server Express作为SqlMembershipProvider的,如果你的数据库不是运行在本机的,可以修改下配置
<connectionStrings>
<add name="MySqlConnection" connectionString="Data Source=MySqlServer;Initial Catalog=aspnetdb;Integrated Security=SSPI;" />
</connectionStrings>
<system.web>
...
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="MySqlConnection"
applicationName="MyApplication"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="true"
passwordFormat="Hashed" />
</providers>
</membership>
SqlMembershipProvider属性配置
属性 |
默认 |
用途 |
connectionStringName |
|
SQL SERVER的连接字符串 |
enablePasswordReset |
False |
密码能否重置 |
requiresQuestionAnd |
False |
是否需要启用取回密码 |
applicationName |
/ |
设置了它可以让多个应用程序在数据库内有所区分,不需要为每个应用建立一个数据库了 |
requiresUniqueEmail |
False |
邮件地址是否需要唯一 |
maxInvalidPassword |
5 |
密码输入错误几次就会锁定用户 |
passwordAttempt |
10 |
每分钟可以失败的次数 |
passwordFormat |
|
密码方式 Clear, Encrypted, 和Hashed. 第一种是明文存储,效率比较高,但是SQL SERVER中能直接读取密码,不安全. 第二种是不可逆加密,需要一定的加密换算过程,但是比较安全.第三种是可逆加密,密码不能找回 |
minRequiredPassword |
7 |
指定至少密码需要几位 |
minRequiredNonAlpha |
1 |
指定需要是非数字字母作为密码的位数,不能大于minRequiredPassword |
passwordStrength |
"" |
指定强度计算的正则表达式 |
defaultProvider : 默认数据提供程序
connectionStringName : 数据库连接字符串节点的key
applicationName : 使用该membership的程序名称
description : 描述信息
minRequiredPasswordLength : 密码最少 多少位
minRequiredNonalphanumericCharacters : 必须包含多少个特殊字符
requiresUniqueEmail : 注册时是否需要email唯一.
enablePasswordRetrieval : 允许找回密码否
enablePasswordReset : 允许修改密码否
requiresQuestionAndAnswer : 注册时是否必须填写密码我问题和答案
passwordFormat : 密码加密方式
name : 名称
type : 类的命名空间
4、建立用户:
可以使用下面的几种方法新建用户
· 打开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地址不重复
5、认证用户
要认证用户,你必须要建立一个登录页面,而它也就是唯一不需要验证的页面
可以使用以下方法建立登录页面:
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")
附:Membership类说明
Membership类重要的一些方法参数和用法
方法名 |
参数 |
备注 |
CreateUser |
string username–创建的用户名. |
|
DeleteUser |
string username–需要删除的用户名 |
返回true表示删除,false表示没有找到 |
FindUsersByName |
string usernameToMatch |
返回找到的用户的集合,支持通配符 "*", "%" 和 "_". |
FindUsersByEmail |
string emailToMatch |
|
GeneratePassword |
int length |
|
GetAllUsers |
int pageIndex |
返回用户记录集 |
GetNumberOfUsersOnline |
None |
返回在线的用户,活动目录不支持 |
GetUsernameByEmail |
string email–需要查找的用户的mail地址 |
|
UpdateUser |
MembershipUser user–需要更新的用户名 |
|
ValidateUser |
string username–需要验证的用户名 |
|
注意 GetAllUsers 方法在 RTM 版本的 .NET Framework 2.0 会取消
特别注意
默认情况下表单认证的票据传输是明文的,为了防止票据被盗窃,我们还是建议你为服务器启用SSL。设置requireSSL属性为true来启用SSL,下面的例子显示了怎么启用SSL,还有不管用户使用http还是https形式的url进入网站都能启用,你可以尝试登录到loginUrl指定的页面看看,但是需要保证这个页面是没有任何约束的
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="https://myserver/mywebapp/secure/Login.aspx"
protection="All"
timeout="30"
name="AppNameCookie"
path="/FormsAuth"
requireSSL="true"
slidingExpiration="true"
defaultUrl="default.aspx"
cookieless="UseCookies"
enableCrossAppRedirects="false"/>
</authentication>
<!—禁止没有权限的用户 -->
<authorization>
<deny users="" />
<allow users="*" />
</authorization>
</system.web>
</configuration>
<!—使得登录页面没有任何限制 -->
<location path="secure">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>