--------转载自幻想曲
http://www.lemongtree.com/zh-cn/0000572.aspx
为什么要自定义呢?
首先,自定义有更大的灵活性,不必过份依赖于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),取得当前用户的所有角色列表
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吧
用户名 密码
admin admin
guest guest
http://demo.lemongtree.com/default.aspx
下载:
http://www.lemongtree.com/download/MemberShip.rar