自定义RoleProvider和MembershipProvider

来源:互联网 发布:keynote转ppt软件 编辑:程序博客网 时间:2024/05/16 10:36

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

  1. public override bool ValidateUser(string username, string password)
  2.     {
  3.         using (OleDbConnection conn = new OleDbConnection(connectionstring))
  4.         {
  5.             OleDbCommand comm = new OleDbCommand();
  6.             comm.CommandText = "select count(0) from users where u_name=@name and u_pwd=@pwd";
  7.             comm.Parameters.AddWithValue("@name", username);
  8.             comm.Parameters.AddWithValue("@pwd", password);
  9.             comm.Connection = conn;
  10.             conn.Open();
  11.             return ((int)comm.ExecuteScalar()) > 0 ? true : false;
  12.         }
  13.     }

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

  1. public override bool IsUserInRole(string username, string roleName)
  2.     {
  3.         using (OleDbConnection conn = new OleDbConnection(connectionstring))
  4.         {
  5.             OleDbCommand comm = new OleDbCommand();
  6.             comm.CommandText = "select top 1 * from users where u_name=@name and u_role=@role";
  7.             comm.Parameters.AddWithValue("@name", username);
  8.             comm.Parameters.AddWithValue("@role", roleName);
  9.             comm.Connection = conn;
  10.             conn.Open();
  11.             using (OleDbDataReader dr = comm.ExecuteReader())
  12.             {
  13.                 if (dr.HasRows)
  14.                 {
  15.                    
  16.                         return true;
  17.                     
  18.                 }
  19.                 return false;
  20.             }
  21.         }
  22.     }

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

  1. public override string[] GetRolesForUser(string username)
  2.     {
  3.         string[] tmp = new string[] { };
  4.         using (OleDbConnection conn = new OleDbConnection(connectionstring))
  5.         {
  6.             OleDbCommand comm = new OleDbCommand();
  7.             comm.CommandText = "select top 1 * from users where u_name=@name";
  8.             comm.Parameters.AddWithValue("@name", username);
  9.            
  10.             comm.Connection = conn;
  11.             conn.Open();
  12.             using (OleDbDataReader dr = comm.ExecuteReader())
  13.             {
  14.                 if (dr.Read())
  15.                 {
  16.                     tmp = dr["U_role"].ToString().Split(',');
  17.                 }
  18.             }
  19.         }
  20.         return tmp;
  21.     }

下面就是更改web.config了
首先,需要对相关页作forms验证
<authentication mode="Forms">
            <forms defaultUrl="default.aspx" loginUrl="userlogin.aspx" path="/" name="Demo"/>
        </authentication>
注意下面的配置,重中之重

  1. <membership defaultProvider="MyMemberShip">
  2.             <providers>
  3.                 <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"/>
  4.             </providers>
  5.         </membership>
  6.         <roleManager defaultProvider="MyRole" enabled="true">
  7.             <providers>
  8.                 <add name="MyRole" type="MyRole"/>
  9.             </providers>
  10.         </roleManager>

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

  1. <location path="admin.aspx">
  2.         <system.web>
  3.             <authorization>
  4.                 <allow roles="admin"/>
  5.                 <deny users="*"/>
  6.             </authorization>
  7.         </system.web>
  8.     </location>
  9.     <location path="guest.aspx">
  10.         <system.web>
  11.             <authorization>
  12.                 <allow roles="guest"/>
  13.                 <deny users="*"/>
  14.             </authorization>
  15.         </system.web>
  16.     </location>

对admin.aspx与guest.aspx做不同的角色控制
累了,直接看demo吧
用户名   密码
admin    admin   
guest    guest

http://demo.lemongtree.com/default.aspx

下载:
http://www.lemongtree.com/download/MemberShip.rar

原创粉丝点击