Membership学习(四)-自定义MembershipProvider[xgluxv]

简介:

自定义MembershipProvider:
前面讲了内置的MembershipProvider,这次 我们自己定义一个Provider
首先我们确定一下保存数据使用ms access,好像土了点。
       我还是用一个例子来说明:
       启动 vs2005,创建一个Asp.net Web Site,名字就取一个NewMembershipProvider,App_Data目录里 建一个Access数据库文件,命名:Members.mdb,创建一个表 名称:MemberShip

字段名

字段类型

描述

username

文本8

用户名 主键

password

文本8

密码

Email

文本50

邮件

passwordQuestion

文本50

密码问题

passwordAnswer

文本50

问题答案

 

 

 

        建完表之后,退出Access,备用:)。

我们在网站生成的default.aspx上拖上两个login控件,首先拖上去一个CreateUserWizard控件,不用做什么修改,接着在CreateUserWizard控件下面放上一个LoginView控件,在LoginViewAnonymousTemplate 视图里拖上一个LoginStatus控件,并把LoginStatus控件的LogoutPageUrl设置为login.aspxlogin系列控件的应用在我的membership(2)中有比较详细的说明。
    
接着 我们建一个新的页面 login.aspx 在页面上拖上一个Login控件,准备工作完成。
   
 在项目里新建一个类,命名为AccessMembershipProvider.cs,类的名字AccessMembershipProvider.继承自MembershipProvidervs2005会帮我们生成可以重载的函数,我们这里不会建立所有的新函数,,我们重载两个属性和两个函数

首先建几个私有变量

    private string connStr;//保存数据库连接字符串
    
private bool _requiresQuestionAndAnswer;//是否需要问题和回答
    
private int _minRequiredPasswordLength;//最短密码长度

需要重载的属性为:
MinRequiredPasswordLength RequiresQuestionAndAnswer
重载的函数
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
public override bool ValidateUser(string username, string password)
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)

下面列出部分的代码:

 

     public   override   int  MinRequiredPasswordLength
    
{
        
get return _minRequiredPasswordLength; }
    }

    
public   override   bool  RequiresQuestionAndAnswer
    
{
        
get
        
{
            
return _requiresQuestionAndAnswer;
        }

    }

 

     public   override   void  Initialize( string  name, System.Collections.Specialized.NameValueCollection config)
    
{
        
if (config["requiresQuestionAndAnswer"].ToLower() == "true")
        
{
            _requiresQuestionAndAnswer 
= true;
        }

        
else
        
{
            _requiresQuestionAndAnswer 
= false;
        }

        
int.TryParse (config["minRequiredPasswordLength"],out _minRequiredPasswordLength );
        connStr 
= config["connectionString"];
        
base.Initialize(name, config);
    }


    
public   override   bool  ValidateUser( string  username,  string  password)
    
{

        System.Data.OleDb.OleDbConnection conn
=new System.Data.OleDb.OleDbConnection(connStr);
        
try
        
{
            conn.Open();
            
string sql = "select * from Membership where username=@username and password=@password";
            System.Data.OleDb.OleDbCommand command 
= new System.Data.OleDb.OleDbCommand(sql, conn);
            command.Parameters.AddWithValue(
"@username", username);
            command.Parameters.AddWithValue(
"@password", password);
            System.Data.OleDb.OleDbDataReader reader 
= command.ExecuteReader();

            
if (reader.HasRows)
            
{
                conn.Close();
                
return true;
            }

            
else
            
{
                conn.Close();
                
return false;
            }

            
        }

        
catch
        
{
            
if (conn.State == ConnectionState.Open)
                conn.Close();
            
return false;
        }


    }

 

     public   override  MembershipUser CreateUser( string  username,  string  password,  string  email,  string  passwordQuestion,  string  passwordAnswer,  bool  isApproved,  object  providerUserKey,  out  MembershipCreateStatus status)
    
{
        System.Data.OleDb.OleDbConnection conn 
= new System.Data.OleDb.OleDbConnection(connStr);
        
try
        
{
            conn.Open();
            
//string sql = "insert into Membership(username,password,Email,passwordQuestion,passwordAnswer) values(@username,@password,@email,@pq,@pa)";
            
//System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(sql, conn);
            
//command.Parameters.AddWithValue("@username", username);
            
//command.Parameters.AddWithValue("@password", password);
            
//command.Parameters.AddWithValue("@email", email);
            
//command.Parameters.AddWithValue("@pq", passwordQuestion);
            
//command.Parameters.AddWithValue("@pa", passwordAnswer);
            
//command.ExecuteNonQuery();
            MembershipUser user = new MembershipUser("AccessMembershipProvider", username, providerUserKey, email, passwordQuestion, "", isApproved, true, DateTime.Now, DateTime.Now , DateTime.Now, DateTime.Now, DateTime.Now);
            status 
= MembershipCreateStatus.Success;
            
return user;

        }

        
catch
        
{
            
if (conn.State == ConnectionState.Open)
                conn.Close();
            status 
= MembershipCreateStatus.ProviderError;
            
return null;
        }

    }

(上面代码里的数据库操作被我注销掉了,因为它老是提示Inert into语句出错,,嘿嘿 又土了一把) 

完成这些代码后 基本上就可以开始测试了,在测试之后我们要建立一个web.config文件在web site中,然后在 <system.web>中填入
<membership defaultProvider="AccessMembershipProvider">
                     <providers>
                            <add name="AccessMembershipProvider" type="AccessMembershipProvider" requiresQuestionAndAnswer="true" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\工作\学习例子\NewMembershipProvider\App_Data\Members.mdb;Persist Security Info=False"/>
                     </providers>
              </membership>
DataSource要根据实际路径填写。




authentication 修改成 <authentication mode="Forms"/>

之后可以启动页面来进行测试了,login控件会根据web.config的配置使用Membership Provider 我们在web.configdefaultProvider中填入了AccessMembershipProvider,它就会用我们自己编写的代码来执行了,你可以修改<add 中的requiresQuestionAndAnswer的值 看看CreateUserWizard控件的显示有什么变化。
例子代码


PS:最近在看BlogEngine.Net的代码,他们自定义了MemberShip Provider,代码也写的很清晰,如果要学习,可以参考他们的代码,在源代码目录:(source)\BlogEngine.Core\Providers\里的DbMembershipProvider.cs和DbRoleProvider.cs

顶

路漫漫其修远兮 吾将上下而求索



本文转自 lu xu 博客园博客,原文链接:http://www.cnblogs.com/dotLive/archive/2006/08/11/474622.html   ,如需转载请自行联系原作者

相关文章
|
3月前
|
Unix Linux 数据库
LDAP学习笔记之四:NIS简解
LDAP学习笔记之四:NIS简解
|
存储 SQL Oracle
【Freelist】关于Freelists和Freelist Groups的探究
1.有关Freelist的描述 数据库读取的单位是数据块(block),一个block是否允许写入数据是基于一定的空闲度--PCTFREE和PCTUSED存储参数设置。 Freelists就是一个指定了所有可以用于insert操作的数据块的列表。 存在于这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了PCTFREE参数指定的限度)则立刻从这个列表中摘除。 Freelists的作用就在于管理高水位标志(HWM)以下的空闲空间,实际上一个segment可用的空闲空间包括两种类型: 1)已经分配给这个segment但是从来未被使用过的位于高水位标志之上的bloc
391 0
|
存储 .NET 数据库
艾伟_转载:WCF版的PetShop之三:实现分布式的Membership和上下文传递
本系列文章导航 WCF版的PetShop之一:PetShop简介 WCF版的PetShop之二:模块中的层次划分 WCF版的PetShop之三:实现分布式的Membership和上下文传递   通过上一篇了解了模块内基本的层次划分之后,接下来我们来聊聊PetShop中一些基本基础功能的实现,以及一些设计、架构上的应用如何同WCF进行集成。
1110 0
|
JSON 前端开发 JavaScript
Nancy之ModelBinding(模型绑定)
原文:Nancy之ModelBinding(模型绑定) 过年前的最后一篇博客,决定留给Nancy中的ModelBinding 还是同样的,我们与MVC结合起来,方便理解和对照 先来看看MVC中简单的ModelBinding吧 1 // POST: Authors/Crea...
992 0
|
存储 数据库 数据安全/隐私保护
|
安全 .NET 数据安全/隐私保护