现在的位置: 首页 > 综合 > 正文

[重写默认的4个权限设置相关的类:二]实现自定义成员提供程序MembershipProvider

2012年10月14日 ⁄ 综合 ⁄ 共 9388字 ⁄ 字号 评论关闭

前言

最近在学习ASP.NET,发现了几个有趣的类,比如自定义用户配置提供程序ProfileProvider,成员提供程序MembershipProvider,角色管理RoleProvider,会话状态SessionStateStoreProvider,这几个类经常作为权限相关设置,但是默认这几个类都必须使用定制的数据库,因此造成诸多限制

但如果重写这些类,然后配合.NET原有的API来使用,这样一来用着方便,二来由于提供程序是自定义的,能够满足自己的要求

于是小弟我试着重写这些类,分享自己的一些心得体会,希望各位前辈能够多多指教啦

 

实现自定义成员提供程序MembershipProvider

一。说明

 

在ASP.NET中,在WEB.CONFIG中进行成员管理的相关配置,就可以在页面中使用许多成员相关的控件,比如:

Login控件

CreateUserWizard控件

 

LoginView,LoginName,LoginStatus控件

 

 

上次写实现自定义用户配置提供程序ProfileProvider的时候,mFrogluotong就提出过,如果用的SQL数据库,使用原来默认的提供程序更方便,确实,如果使用SQL,直接使用默认的提供程序比自己再写个方便多了。所以,这次重写,使用XML文件作为存储的介质,才能够体现重写的优势----因为默认的提供程序不支持XML(-_-#)。

 

在重写之前,首先要了解该类的一些需要重写的方法和属性,新类必须继承自MembershipProvider类

属性:

string ApplicationName//应用程序名

string Description//一些描述

bool EnablePasswordReset//是否允许用户重置其密码

bool EnablePasswordRetrieval//是否允许用户检索其密码

int MaxInvalidPasswordAttempts//密码尝试次数

int MinRequiredNonAlphanumericCharacters//密码得最少特殊字符

int MinRequiredPasswordLength//密码的最少长度

int PasswordAttemptWindow//用户因为密码错误被锁定的最大分钟数

MembershipPasswordFormat PasswordFormat//存密码的格式

string PasswordStrengthRegularExpression//计算密码的正则表达式

bool RequiresQuestionAndAnswer//是否在密码重置或检索时验证问题答案

bool RequiresUniqueEmail//是否E-mail地址唯一

 

方法:

void Initialize(string name, System.Collections.Specialized.NameValueCollection config)//初始化

bool ValidateUser(string username, string password)//验证用户密码

MembershipUser GetUser(string username, bool userIsOnline)//根据用户名得到用户信息

MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)//得到所有的用户信息(前两个参数是分页,最后那个是用户总数)

string GetUserNameByEmail(string email)//根据EMAIL得到用户信息

MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)//创建一个用户

int GetNumberOfUsersOnline()//获取在线人数

MembershipUser GetUser(object providerUserKey, bool userIsOnline)//根据用户标识来获取用户信息

bool ChangePassword(string username, string oldPassword, string newPassword)//修改密码

bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)//修改问题和答案

bool DeleteUser(string username, bool deleteAllRelatedData)//删除用户

MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)//根据EAMIL获取多个用户信息

MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) //根据用户名来获取多个用户信息

string GetPassword(string username, string answer)//获取密码

bool UnlockUser(string userName)//解锁用户

void UpdateUser(MembershipUser user)//更新用户

string ResetPassword(string username, string answer)//重设密码

 

 

二。实现

 

首先建立一个名为Users.xml的XML文件,结构如下

<?xml version="1.0" encoding="utf-8"?>
<Users>
  
<User Name="Test1">
    
<PassWord>132123</PassWord>
    
<Email>asd@asd.com</Email>
    
<PassWordQuestion>你是?</PassWordQuestion>
    
<PassWordAnswer></PassWordAnswer>
    
<IsApproved>true</IsApproved>
    
<IsLockedOut>false</IsLockedOut>
    
<CreatingDate>2009/3/8 15:35</CreatingDate>
    
<LastLoginDate>2009/3/8 15:35</LastLoginDate>
    
<LastActivityDate>2009/3/8 15:35</LastActivityDate>
    
<LastPassWordChangedDate>2009/3/8 15:35</LastPassWordChangedDate>
    
<LastLockOutDate>2009/3/8 15:35</LastLockOutDate>
  
</User>
</Users>

 

 

然后重写这个类,这里只列出一些关键代码

 

Code

 

最后,修改WEB.CONFIG,大功告成

 

    <membership defaultProvider="aaaa">
        
<providers>
                
<add name="aaaa" type="OverrideMembershipProvider"/>
        
</providers>
    
</membership>
    
<authentication mode="Forms">
      
<forms loginUrl="Default.aspx"></forms>
    
</authentication>

 

接下来就可以享用这些控件了

 

附:源码下载

(说明:Class1.cs相当于一个业务逻辑类,只有一个方法,用于返回所有的用户集合,主要是为了配合ObjectDataSource(Default2.aspx页面会使用并显示所有用户信息)

OverrideMembershipProvider.cs则是重写后的提供程序类,并没有把每个属性和方法都实现,只实现了一些关键的部分

Default.aspx是登陆界面

Default2.aspx显示所有用户信息

Default3.aspx建立新用户

Default4.aspx根据登陆情况显示用户信息,并可以登陆登出)

抱歉!评论已关闭.