自定义RoleProvider
时间:2006-11-28
来源:互联网
论坛标题长度限制太短,不得已,改标题,原标题是:自定义RoleProvider和MembershipProvider
看到csdn上有很多朋友问起,BI里也有,遂写该文,只是粗略地实现用户验证及角色分配
环境:.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]
这就实现了用户的验证。
下面实现角色的验证[MyRole.cs]
要实现的方法有:
bool IsUserInRole(string username, string roleName)
用于验证用户是否属于指定的角色
第二个要实现的方法:
string[] GetRolesForUser(string username),取得当前用户的所有角色列表
首先,需要对相关页作forms验证
<authentication mode="Forms">
<forms defaultUrl="default.aspx" loginUrl="userlogin.aspx" path="/" name="Demo"/>
</authentication>
注意下面的配置,重中之重
累了,直接看demo吧
用户名 密码
admin admin
guest guest
http://demo.lemongtree.com/default.aspx
原文及下载地址:
http://www.lemongtree.com/zh-cn/0000572.aspx
看到csdn上有很多朋友问起,BI里也有,遂写该文,只是粗略地实现用户验证及角色分配
环境:.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]
复制内容到剪贴板
{
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中的。这个方法不用多说,相信大家能看明白。代码:
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;
}
}
这就实现了用户的验证。
下面实现角色的验证[MyRole.cs]
要实现的方法有:
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;
}
}
}
代码简单,也不多说了代码:
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),取得当前用户的所有角色列表
复制内容到剪贴板
{
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了代码:
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;
}
首先,需要对相关页作forms验证
<authentication mode="Forms">
<forms defaultUrl="default.aspx" loginUrl="userlogin.aspx" path="/" name="Demo"/>
</authentication>
注意下面的配置,重中之重
复制内容到剪贴板
<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,否则会失效。
代码:
<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>
复制内容到剪贴板
<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做不同的角色控制代码:
<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>
累了,直接看demo吧
用户名 密码
admin admin
guest guest
http://demo.lemongtree.com/default.aspx
原文及下载地址:
http://www.lemongtree.com/zh-cn/0000572.aspx
作者: 幻想曲 发布时间: 2006-11-28
你这是高级应用,我想大家对更简单的应用更兴趣吧。最近我也在学membership,一起交流啊
作者: blackdark 发布时间: 2006-12-02
我顶你个肺啊!~~~
作者: blackdark 发布时间: 2006-12-07
自定义Login的确非常方便顶起!
作者: fujiaweiwei 发布时间: 2011-08-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28