博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Membership学习(四)-自定义MembershipProvider[xgluxv]
阅读量:6376 次
发布时间:2019-06-23

本文共 4841 字,大约阅读时间需要 16 分钟。

自定义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控件,在LoginView的AnonymousTemplate 视图里拖上一个LoginStatus控件,并把LoginStatus控件的LogoutPageUrl设置为login.aspx,login系列控件的应用在我的中有比较详细的说明。

    接着 我们建一个新的页面 login.aspx 在页面上拖上一个Login控件,准备工作完成。
    在项目里新建一个类,命名为AccessMembershipProvider.cs,类的名字 AccessMembershipProvider.继承自MembershipProvider,vs2005会帮我们生成可以重载的函数,我们这里不会建立所有的新函数,,我们重载两个属性和两个函数

首先建几个私有变量

    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)

下面列出部分的代码:

 

None.gif
    
public
 
override
 
int
 MinRequiredPasswordLength
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _minRequiredPasswordLength; }
ExpandedBlockEnd.gif    }
None.gif    
public
 
override
 
bool
 RequiresQuestionAndAnswer
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
{
InBlock.gif        
get
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return _requiresQuestionAndAnswer;
ExpandedSubBlockEnd.gif        }
ExpandedBlockEnd.gif    }
None.gif

 

None.gif
    
public
 
override
 
void
 Initialize(
string
 name, System.Collections.Specialized.NameValueCollection config)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
{
InBlock.gif        
if (config["requiresQuestionAndAnswer"].ToLower() == "true")
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            _requiresQuestionAndAnswer 
= true;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            _requiresQuestionAndAnswer 
= false;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
int.TryParse (config["minRequiredPasswordLength"],out _minRequiredPasswordLength );
InBlock.gif        connStr 
= config["connectionString"];
InBlock.gif        
base.Initialize(name, config);
ExpandedBlockEnd.gif    }
None.gif
None.gif    
public
 
override
 
bool
 ValidateUser(
string
 username, 
string
 password)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
{
InBlock.gif
InBlock.gif        System.Data.OleDb.OleDbConnection conn
=new System.Data.OleDb.OleDbConnection(connStr);
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            conn.Open();
InBlock.gif            
string sql = "select * from Membership where username=@username and password=@password";
InBlock.gif            System.Data.OleDb.OleDbCommand command 
= new System.Data.OleDb.OleDbCommand(sql, conn);
InBlock.gif            command.Parameters.AddWithValue(
"@username", username);
InBlock.gif            command.Parameters.AddWithValue(
"@password", password);
InBlock.gif            System.Data.OleDb.OleDbDataReader reader 
= command.ExecuteReader();
InBlock.gif
InBlock.gif            
if (reader.HasRows)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                conn.Close();
InBlock.gif                
return true;
ExpandedSubBlockEnd.gif            }
InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                conn.Close();
InBlock.gif                
return false;
ExpandedSubBlockEnd.gif            }
InBlock.gif            
ExpandedSubBlockEnd.gif        }
InBlock.gif        
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (conn.State == ConnectionState.Open)
InBlock.gif                conn.Close();
InBlock.gif            
return false;
ExpandedSubBlockEnd.gif        }
InBlock.gif
ExpandedBlockEnd.gif    }

 

None.gif
    
public
 
override
 MembershipUser CreateUser(
string
 username, 
string
 password, 
string
 email, 
string
 passwordQuestion, 
string
 passwordAnswer, 
bool
 isApproved, 
object
 providerUserKey, 
out
 MembershipCreateStatus status)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
{
InBlock.gif        System.Data.OleDb.OleDbConnection conn 
= new System.Data.OleDb.OleDbConnection(connStr);
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            conn.Open();
InBlock.gif            
//string sql = "insert into Membership(username,password,Email,passwordQuestion,passwordAnswer) values(@username,@password,@email,@pq,@pa)";
InBlock.gif            
//System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(sql, conn);
InBlock.gif            
//command.Parameters.AddWithValue("@username", username);
InBlock.gif            
//command.Parameters.AddWithValue("@password", password);
InBlock.gif            
//command.Parameters.AddWithValue("@email", email);
InBlock.gif            
//command.Parameters.AddWithValue("@pq", passwordQuestion);
InBlock.gif            
//command.Parameters.AddWithValue("@pa", passwordAnswer);
InBlock.gif            
//command.ExecuteNonQuery();
InBlock.gif
            MembershipUser user = new MembershipUser("AccessMembershipProvider", username, providerUserKey, email, passwordQuestion, "", isApproved, true, DateTime.Now, DateTime.Now , DateTime.Now, DateTime.Now, DateTime.Now);
InBlock.gif            status 
= MembershipCreateStatus.Success;
InBlock.gif            
return user;
InBlock.gif
ExpandedSubBlockEnd.gif        }
InBlock.gif        
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (conn.State == ConnectionState.Open)
InBlock.gif                conn.Close();
InBlock.gif            status 
= MembershipCreateStatus.ProviderError;
InBlock.gif            
return null;
ExpandedSubBlockEnd.gif        }
ExpandedBlockEnd.gif    }

(上面代码里的数据库操作被我注销掉了,因为它老是提示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.config中defaultProvider中填入了AccessMembershipProvider,它就会用我们自己编写的代码来执行了,你可以修改<add 中的requiresQuestionAndAnswer的值 看看CreateUserWizard控件的显示有什么变化。

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

转载地址:http://pttqa.baihongyu.com/

你可能感兴趣的文章
hashlib,configparser,logging模块
查看>>
使用uploadify上传图片时返回“Cannot read property 'queueData' of undefined”
查看>>
树形 DP 总结
查看>>
xcdatamodel的实质
查看>>
转载:substr() mb_substr() mb_subcut区别与联系
查看>>
shell模板-跨目录执行,彩色输出,临时文件,行遍历文件
查看>>
php后台管理员权限相关表结构
查看>>
如何定制 Calico 网络 Policy - 每天5分钟玩转 Docker 容器技术(70)
查看>>
Ubuntu 16.04出现Can't open /etc/rc.d/init.d/functions的问题解决
查看>>
Oracle查询及删除重复数据
查看>>
获取UWP配置文件中的版本信息
查看>>
Hive函数大全
查看>>
LNMP环境的搭建(yum)方法(精)
查看>>
PyTorch学习笔记(1) 基础知识
查看>>
C#实现字符串按多个字符采用Split方法分割
查看>>
爬虫能干什么?
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
[转]C#综合揭秘——Entity Framework 并发处理详解
查看>>
MySQL数据库以及表的管理
查看>>
局域网内一台电脑的ip地址自己会变,怎样让它不变
查看>>