成员系统
System.Web.Security.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地址 |
通过E-mail地址返回用户名 |
UpdateUser |
MembershipUser user–需要更新的用户名 |
更新用户 |
ValidateUser |
string username–需要验证的用户名 |
验证输入的用户是否为注册用户 |
其中一些函数以MembershipUser类作为输入参数或者返回值,该类表示单个用户,提供了很多用户细节,对应的属性和方法如下:
名称 |
说明 |
Comment |
获取或设置成员资格用户的特定于应用程序的信息。 |
CreationDate |
获取将用户添加到成员资格数据存储区的日期和时间。 |
|
获取或设置成员资格用户的电子邮件地址。 |
IsApproved |
获取或设置一个值,表示是否可以对成员资格用户进行身份验证。 |
IsLockedOut |
获取一个值,该值指示成员资格用户是否因被锁定而无法进行验证。 |
IsOnline |
获取一个值,表示用户当前是否联机。 |
LastActivityDate |
获取或设置成员资格用户上次进行身份验证或访问应用程序的日期和时间。 |
LastLockoutDate |
获取最近一次锁定成员资格用户的日期和时间。 |
LastLoginDate |
获取或设置用户上次进行身份验证的日期和时间。 |
LastPasswordChangedDate |
获取上次更新成员资格用户的密码的日期和时间。 |
PasswordQuestion |
获取成员资格用户的密码提示问题。 |
ProviderName |
获取成员资格提供程序的名称,该提供程序存储并检索成员资格用户的用户信息。 |
ProviderUserKey |
从用户的成员资格数据源获取用户标识符。对应于数据库中的UserId |
UserName |
获取成员资格用户的登录名。 |
方法:
名称 |
说明 |
ChangePassword |
更新成员资格数据存储区中成员资格用户的密码。 |
ChangePasswordQuestionAndAnswer |
更新成员资格数据存储区中成员资格用户的密码提示问题和密码提示问题答案。 |
GetPassword |
已重载。 从成员资格数据存储区获取成员资格用户的密码。 |
ResetPassword |
已重载。 将用户密码重置为一个自动生成的新密码。 |
UnlockUser |
清除用户的锁定状态以便可以验证成员资格用户。 |
下面来进行测试:
通过安全设置向导一步步提示[创建一个用户]:最终会在App_data目录下创建数据库AspNetDb
数据库和表都自动建立好后,运行页面的[Button1_Click]。
运行错误:
提示:创建用户失败!提供的密码答案无效。继续完善改动:
测试我们发现:密码的长度有要求,必须包含至少一个特殊字符[非字母且非数字字符]。邮箱没有验证格式,不同的用户名用同一个邮箱仍然可以注册成功!
其实工具箱已经封装好了现成的用户注册控件[CreateUserWizard],直接用就好了!
提供程序模型设计模式
可自定义提供程序类,或者使用第三方提供的类(用于Oracle、MySQL、DB2、XML文件),但系统本身有两个内置的提供程序类(分别用于SQL Server2000/2005的SqlMembershipProvider和用于活动目录的ActiveDirectoryMembershipProvider)可供成员系统使用,如需要进行选择需要在web.config文件中添加设置。
要创建一个新的提供程序类,见代码:
public class SqlMembershipProviderEx :SqlMembershipProvider { public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) { if (username.ToLower() == password.ToLower()) //确保密码同用户名不同 { status = MembershipCreateStatus.InvalidPassword; return null; } else return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status); } }
在web.config文件中可以为成员系统所用的提供程序进行指定和配置。可以查看机器中已有的相关设置:
SqlMembershipProvider的公共属性如下:(来自MSDN)
名称 | 说明 | |
---|---|---|
![]() |
ApplicationName | 已重写。 获取或设置要存储和检索其成员资格信息的应用程序的名称。 |
![]() |
Description | 获取一条简短的易懂描述,它适合在管理工具或其他用户界面 (UI) 中显示。 (从 ProviderBase 继承) |
![]() |
EnablePasswordReset | 已重写。 获取一个值,指示 SQL Server 成员资格提供程序是否配置为允许用户重置其密码。 |
![]() |
EnablePasswordRetrieval | 已重写。 获取一个值,指示 SQL Server 成员资格提供程序是否配置为允许用户检索其密码。 |
![]() |
MaxInvalidPasswordAttempts | 已重写。 获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。 |
![]() |
MinRequiredNonAlphanumericCharacters | 已重写。 获取有效密码中必须包含的最少特殊字符数。 |
![]() |
MinRequiredPasswordLength | 已重写。 获取密码所要求的最小长度。 |
![]() |
Name | 获得一个友好名称,用于在配置过程中引用提供程序。 (从 ProviderBase 继承) |
![]() |
PasswordAttemptWindow | 已重写。 获取时间长度,在该时间间隔内对提供有效密码或密码答案的连续失败尝试次数进行跟踪。 |
![]() |
PasswordFormat | 已重写。 获取一个值,表示用于在 SQL Server 成员资格数据库中存储密码的格式。 |
![]() |
PasswordStrengthRegularExpression | 已重写。 获取用于计算密码的正则表达式。 |
![]() |
RequiresQuestionAndAnswer | 已重写。 获取一个值,指示 SQL Server 成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。 |
![]() |
RequiresUniqueEmail | 已重写。 获取一个值,指示 SQL Server 成员资格提供程序是否配置为要求每个用户名具有唯一的电子邮件地址。 |
默认情况下,MinRequiredPasswordLength的值为7,MinRequiredNonAlphanumericCharacters 的值为1,意味着用户注册的长度至少为7且至少包含一个非字母及数字字符。
PasswordFormat :SQL Server 成员资格提供程序支持 Clear、Encrypted 和 Hashed 密码格式。Clear 密码以明文形式存储,可提高密码存储和检索的性能,但安全性较低,因为如果 SQL Server 数据库的安全受到威胁,可轻松读取密码。Encrypted 密码在存储时加密,并可解密以进行密码比较或密码检索。此类密码在存储和检索时需要进行额外的处理,但比较安全,在 SQL Server 数据库的安全性受到威胁时不容易被获取。Hashed 密码在存储到数据库时使用单向哈希算法和随机生成的 salt 值进行哈希计算。在验证某一密码时,将用数据库中的 salt 值对该密码进行哈希计算以进行验证。无法检索哈希密码。
Encrypted 和 Hashed 密码默认情况下基于配置的 machineKey 元素中提供的信息进行加密或哈希计算。请注意,如果为 validation 属性指定了 3DES 值,或者没有指定值,则将使用 SHA1算法对哈希密码进行哈希计算。
可使用 membership 元素(ASP.NET 设置架构) 配置元素的 hashAlgorithmType 属性定义一个自定义哈希算法。如果选择加密,默认密码加密则使用 AES。可以通过设置 machineKey 配置元素的 decryption 属性更改加密算法。如果要对密码进行加密,则必须为 machineKey 元素中的 decryptionKey 属性显式提供一个值。对 ASP.NET 成员资格使用加密密码时不支持 decryptionKey 属性的 AutoGenerate默认值。
接下来,对web.config进行成员配置,
实现:(密码长度至少5位,不需要特殊字符,用户的邮件必须唯一,注册/重设密码时刻不用密码问题和答案,选择用户有好对称加密方式)
为了配置密钥,需要在machineKey元素中设置validationKey和decryptionKey。因为成员系统使用普通加密方式,所以不能设置为默认的AutoGenerate,可以使用一个在线工具:www.aspnetresources.com/tools/keycreator.aspx,点击生成按钮,效果如图:
运行代码:
Membership.CreateUser("小张", "123456",xiaozhang@qq.com);
可以正常使用了!
与第一次默认的按钮事件情形不一样的处理效果了!(前面蓝色加粗字体)
查看对应的数据库关系图和表数据,密码自动加密!
当来之世,经道灭尽,我以慈悲哀愍,特留此经止住百岁。其有众生,值斯经者,随意所愿,皆可得度。(南无阿弥陀佛)
道可道,非常道;名可名,非常名。
我常说,一个国家,一个民族,亡国都不怕,最可怕的是一个国 家和民族自己的根本文化亡掉了,这就会沦为万劫不复,永远不会翻身。---南怀瑾<国学大师>