zoukankan      html  css  js  c++  java
  • 自定义RoleProvider

    自定义RoleProvider

    作者的站点:http://www.lemongtree.com/
    原文:http://www.lemongtree.com/zh-cn/0000572.aspx

    环境:.Net 2.0,非1.1
    注意,这里用的是Login控件
    为什么要自定义呢?
    首先,自定义有更大的灵活性,不必过份依赖于aspnetdb数据库,有利于自己的扩展;其次,自定义以后仍然可以用.Net 2.0中自带的Login控件。
    当然,自定义不是随便自定义,而要是实现二个抽象类:
    MembershipProvider和RoleProvider
    这二个抽象类的说明请参见SDK 2.0或MSDN,这里不多说了。
    在这个Demo中,MembershipProvider中要重写的方法有:ValidateUser
    因为我只是为了验证用户,要实现创建、编辑,就要实现UpdateUser方法、CreateUser方法了。
    看ValidateUser方法的重写:[MyMemberShip.cs]

    public override bool ValidateUser(string username, string password)
        {
            using (OleDbConnection conn = new OleDbConnection(connectionstring))
            {
                OleDbCommand comm = new OleDbCommand();
                comm.CommandText = "select count(0) from users where u_name=@name and u_pwd=@pwd";
                comm.Parameters.AddWithValue("@name", username);
                comm.Parameters.AddWithValue("@pwd", password);
                comm.Connection = conn;
                conn.Open();
                return ((int)comm.ExecuteScalar()) > 0 ? true : false;
            }
        }

    这里的变量connectionstring我写在.cs里了,这只是为了演示,应该写在web.config中的。这个方法不用多说,相信大家能看明白。
    这就实现了用户的验证。
    下面实现角色的验证[MyRole.cs]
    要实现的方法有:

    bool IsUserInRole(string username, string roleName)

    用于验证用户是否属于指定的角色

    public override bool IsUserInRole(string username, string roleName)
        {
            using (OleDbConnection conn = new OleDbConnection(connectionstring))
            {
                OleDbCommand comm = new OleDbCommand();
                comm.CommandText = "select top 1 * from users where u_name=@name and u_role=@role";
                comm.Parameters.AddWithValue("@name", username);
                comm.Parameters.AddWithValue("@role", roleName);
                comm.Connection = conn;
                conn.Open();
                using (OleDbDataReader dr = comm.ExecuteReader())
                {
                    if (dr.HasRows)
                    {
                      
                            return true;
                       
                    }
                    return false;
                }
            }
        }

    代码简单,也不多说了
    第二个要实现的方法:
    string[] GetRolesForUser(string username),取得当前用户的所有角色列表


    [Copy to clipboard]CODE:
    public override string[] GetRolesForUser(string username)
        {
            string[] tmp = new string[] { };
            using (OleDbConnection conn = new OleDbConnection(connectionstring))
            {
                OleDbCommand comm = new OleDbCommand();
                comm.CommandText = "select top 1 * from users where u_name=@name";
                comm.Parameters.AddWithValue("@name", username);
              
                comm.Connection = conn;
                conn.Open();
                using (OleDbDataReader dr = comm.ExecuteReader())
                {
                    if (dr.Read())
                    {

                        tmp = dr["U_role"].ToString().Split(',');

                    }

                }
            }
            return tmp;
        }

    下面就是更改web.config了
    首先,需要对相关页作forms验证

    <authentication mode="Forms">
                <forms defaultUrl="default.aspx" loginUrl="userlogin.aspx" path="/" name="Demo"/>
            </authentication>

    注意下面的配置,重中之重

    <membership defaultProvider="MyMemberShip">
                <providers>
                    <add name="MyMemberShip" type="MyMemberShip" requiresQuestionAndAnswer="true" connectionString="Provider =Microsoft.Jet.OLEDB.4.0;Data Source=H:\Documents and Settings\Administrator \桌面\Demo\demo.mdb;Persist Security Info=False"/>
                </providers>
            </membership>
            <roleManager defaultProvider="MyRole" enabled="true">
                <providers>
                    <add name="MyRole" type="MyRole"/>
                </providers>
            </roleManager>

    注意roleManager中的enabled一定要为true,否则会失效。

    <location path="admin.aspx">
            <system.web>
                <authorization>
                    <allow roles="admin"/>
                    <deny users="*"/>
                </authorization>
            </system.web>
        </location>
        <location path="guest.aspx">
            <system.web>
                <authorization>
                    <allow roles="guest"/>
                    <deny users="*"/>
                </authorization>
            </system.web>
        </location>

    对admin.aspx与guest.aspx做不同的角色控制
    累了,直接看demo:http://demo.lemongtree.com/default.aspx
    用户名   密码
    admin    admin  
    guest    guest

    下载:MemberShip.rar

    经典论坛讨论
    http://bbs.blueidea.com/thread-2698142-1-1.html

  • 相关阅读:
    2019.6.20刷题统计
    36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量
    35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型
    34 进程 pid ppid 并发与并行,阻塞与非阻塞 join函数 process对象 孤儿进程与僵尸进程
    33 udp 域名 进程
    32 粘包 文件传输
    31 socket客户端. 服务器 异常 语法
    30 网络编程
    29 元类 异常
    26 封装 反射 常用内置函数
  • 原文地址:https://www.cnblogs.com/angells/p/1536904.html
Copyright © 2011-2022 走看看