petshop4.0学习记录一:Memebership的使用

membership介绍:
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"表示关闭cookieSSL加密

· 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

密码能否重置
安全原因,只有当
requiresQuestionAndAnswer
设置为 true的时候你才可以设置enablePasswordResettrue

requiresQuestionAnd
Answer

False

是否需要启用取回密码

applicationName

/

设置了它可以让多个应用程序在数据库内有所区分,不需要为每个应用建立一个数据库了

requiresUniqueEmail

False

邮件地址是否需要唯一

maxInvalidPassword
Attempts

5

密码输入错误几次就会锁定用户

passwordAttempt
Window

10

每分钟可以失败的次数

passwordFormat

密码方式 Clear, Encrypted, Hashed. 第一种是明文存储,效率比较高,但是SQL SERVER中能直接读取密码,不安全. 第二种是不可逆加密,需要一定的加密换算过程,但是比较安全.第三种是可逆加密,密码不能找回

minRequiredPassword
Length

7

指定至少密码需要几位

minRequiredNonAlpha
numericCharacters

1

指定需要是非数字字母作为密码的位数,不能大于minRequiredPassword
Length

passwordStrength
RegularExpression

""

指定强度计算的正则表达式

通俗说法:
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创建的用户名.
string password
新用户密码
string email
新用户mail地址
string passwordQuestion
string passwordAnswer
bool IsApproved
object providerUserKey

DeleteUser

string username需要删除的用户名
bool removeAllRelatedData

返回true表示删除,false表示没有找到

FindUsersByName

string usernameToMatch
int pageIndex
int pageSize

返回找到的用户的集合,支持通配符 "*", "%" "_".

FindUsersByEmail

string emailToMatch
int pageIndex
int pageSize

GeneratePassword

int length
Int numberOfNonAlpha
NumericCharacters

GetAllUsers

int pageIndex
int pageSize

返回用户记录集

GetNumberOfUsersOnline

None

返回在线的用户,活动目录不支持

GetUsernameByEmail

string email需要查找的用户的mail地址

UpdateUser

MembershipUser user需要更新的用户名

ValidateUser

string username需要验证的用户名
string password
需要验证的密码

注意 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>

你可能感兴趣的:(学习)