Membership学习(四)-自定义MembershipProvider

Membership学习(四)-自定义MembershipProvider

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

下面列出部分的代码:

 

    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.config中defaultProvider中填入了AccessMembershipProvider,它就会用我们自己编写的代码来执行了,你可以修改<add 中的requiresQuestionAndAnswer的值 看看CreateUserWizard控件的显示有什么变化。
例子代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是我学习asp.net2.0、XML、UltraChart后为了将所学串联起来所做的项目实践,背景针对的是名片夹的管理。有以下注意事项: 1、建立名为“MyCardHolder”的虚拟目录,设置起始页为login.aspx 2、程序采用的是AccessMemberShip来储存用户信息,其它信息分别存储于AddressLists表和GroupType表中 AddressLists表主要用来存储用户的联系人信息,其数据字典如下: (id,userID,frdName,frdType,frdPhone,frdMobilePhone,frdAddress,frdCode,frdQQ,frdEmail) 其中id自增,为主键;userID用来记录联系人信息的创建人,不能为空;frdType用来记录联系人属于哪个分组,也不能为空。其余字段依次表示:联系人的名字、联系人的固定电话,联系人的移动电话,联系人的住址,联系人的邮政编码,联系人的QQ,联系人的油箱 GroupType表主要用来存储用户自定义的联系人分组信息,其数据字典如下: (id,userID,frdType) 其中id自增,为主键;userID用来记录联系人分组的创建人,不能为空;frdType用来记录创建人所建立的分组类型,也不能为空。 3、特别提示:以下三个表aspnet_Users、GroupType、AddressLists可以手动修改,其余表不要改动,建议通过程序来操作! 5、程序操作简单流程是:注册新用户---->自定义联系人分组---->添加联系人信息---->维护或查询联系人信息 6、如果要查看UltraChart的功能,请修改menu.sitemap,并包括两文件GetInfoByType.aspx和GetInfoByType_Pie.aspx,然后编译运行!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值