asp.net用户角色管理
大部分web系统均有用户角色管理,根据用户的角色(权限)允许或拒绝用户访问某个页面,在这我实现了一个管理三类用户的Demo,游客无访问权 限,管理员(角色为manger)登录后可访问manger文件夹下的aspx页面,普通用户(角色为member)登录后可访问member文件夹夹下 了文件。
1、数据库为SQL Server2005,数据库名:UsersManger,数据表Users。
在web.config中配置连接字符串
1 <connectionStrings>
2 <add name="strConn" connectionString="Server=(local);DataBase=UsersManger;Integrated Security=SSPI;"/>
3 </connectionStrings>
2 <add name="strConn" connectionString="Server=(local);DataBase=UsersManger;Integrated Security=SSPI;"/>
3 </connectionStrings>
2、解决方案的结构截图
大家可能对ASPNETDB.mdf数据库文件感到疑问,这是微软的实例数据之一,如果在系统中使用成员管理、角色管理等,这个数据库会自动添加到系统App_Da
3、在web.config文件中配置用户访问权限
使用Roles类实现用户角色功能时,首先需要在system.web配置节下设置允许使用用户角色管理:
<roleManager enabled="true" cacheRolesInCookie="true"/>
(1)拒绝匿名用户即游客访问网站,如果访问跳转到Login.aspx登录页,在system.web配置节下设置:
代码
<authentication mode="Forms">
<forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".APSXAUTH" protection="All" timeout="60"></forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
<forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".APSXAUTH" protection="All" timeout="60"></forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
(2)下面的配置内容表示只有在角色为manger的用户登录后才能访问manger文件下的aspx页面。
<location path="manger">
<system.web>
<authorization>
<allow roles="manger"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<system.web>
<authorization>
<allow roles="manger"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
(3)下面的配置内容表示只有在角色为member的用户登录后才能访问manger文件下的aspx页面。
<location path="member">
<system.web>
<authorization>
<allow roles="member"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<system.web>
<system.web>
<authorization>
<allow roles="member"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<system.web>
4、登录页Login.aspx页面源码
代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>用户登录</title>
</head>
<body>
<form id="form1" runat="server">
<div>
用户名:<asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
<br />
<br />
密 码:<asp:TextBox ID="txtUserPassword" runat="server"
TextMode="Password"></asp:TextBox>
<br />
<br />
用户类型:<asp:DropDownList ID="ddlUserRole" runat="server">
<asp:ListItem Selected="True" Value="selectRole">请选择</asp:ListItem>
<asp:ListItem Value="manger">管理员</asp:ListItem>
<asp:ListItem Value="member">普通用户</asp:ListItem>
</asp:DropDownList>
<br />
<br />
<asp:Button ID="btnLogin" runat="server" onclick="btnLogin_Click" Text="登录" />
</div>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>用户登录</title>
</head>
<body>
<form id="form1" runat="server">
<div>
用户名:<asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
<br />
<br />
密 码:<asp:TextBox ID="txtUserPassword" runat="server"
TextMode="Password"></asp:TextBox>
<br />
<br />
用户类型:<asp:DropDownList ID="ddlUserRole" runat="server">
<asp:ListItem Selected="True" Value="selectRole">请选择</asp:ListItem>
<asp:ListItem Value="manger">管理员</asp:ListItem>
<asp:ListItem Value="member">普通用户</asp:ListItem>
</asp:DropDownList>
<br />
<br />
<asp:Button ID="btnLogin" runat="server" onclick="btnLogin_Click" Text="登录" />
</div>
</form>
</body>
</html>
5、单击登录按钮事件代码在(Login.aspx.cs)中
进行数据库操作,导入命名空间:
代码
using System.Data.SqlClient;
protected void btnLogin_Click(object sender, EventArgs e)
{
string UserName = txtUserName.Text.Trim().ToString();
string UserPassword = txtUserPassword.Text.Trim().ToString();
string UserRole = ddlUserRole.SelectedItem.Value.ToString();
SqlConnection Conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["strConn"].ToString());
Conn.Open();
string sqlLogin = "select count(*) from Users where UserName='" + UserName + "' and UserPassword='" + UserPassword + "'";
if (UserRole == "manger")//如果选择管理员
{
sqlLogin += "and UserRole='" + UserRole + "'";
SqlCommand Cmd = new SqlCommand(sqlLogin, Conn);
int result = Convert.ToInt32(Cmd.ExecuteScalar());
if (result > 0)//管理员用户存在
{
if (Roles.RoleExists(UserRole))//判断该用户角色是否已经存在
{
FormsAuthentication.RedirectFromLoginPage(UserName, false);//登录主页或跳转到刚刚请求的页面
}
else
{
Roles.CreateRole(UserRole);//该用户还没创建角色,则创建该角色
Roles.AddUserToRole(UserName, UserRole);//添加该用户到指定的角色
FormsAuthentication.RedirectFromLoginPage(UserName, false);//登录主页或跳转到刚刚请求的页面
}
}
else
{
Response.Write("用户名或密码错误!");
}
Conn.Close();
}
else if (UserRole == "member")
{
sqlLogin += "and UserRole='" + UserRole + "'";
SqlCommand Cmd = new SqlCommand(sqlLogin, Conn);
int result = Convert.ToInt32(Cmd.ExecuteScalar());
if (result > 0)
{
if (Roles.RoleExists(UserRole))
{
Roles.CreateRole(UserRole);
Roles.AddUserToRole(UserName, UserRole);
FormsAuthentication.RedirectFromLoginPage(UserName, false);
}
FormsAuthentication.RedirectFromLoginPage(UserName, false);
}
else
{
Response.Write("用户名或密码错误!");
}
Conn.Close();
}
}
protected void btnLogin_Click(object sender, EventArgs e)
{
string UserName = txtUserName.Text.Trim().ToString();
string UserPassword = txtUserPassword.Text.Trim().ToString();
string UserRole = ddlUserRole.SelectedItem.Value.ToString();
SqlConnection Conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["strConn"].ToString());
Conn.Open();
string sqlLogin = "select count(*) from Users where UserName='" + UserName + "' and UserPassword='" + UserPassword + "'";
if (UserRole == "manger")//如果选择管理员
{
sqlLogin += "and UserRole='" + UserRole + "'";
SqlCommand Cmd = new SqlCommand(sqlLogin, Conn);
int result = Convert.ToInt32(Cmd.ExecuteScalar());
if (result > 0)//管理员用户存在
{
if (Roles.RoleExists(UserRole))//判断该用户角色是否已经存在
{
FormsAuthentication.RedirectFromLoginPage(UserName, false);//登录主页或跳转到刚刚请求的页面
}
else
{
Roles.CreateRole(UserRole);//该用户还没创建角色,则创建该角色
Roles.AddUserToRole(UserName, UserRole);//添加该用户到指定的角色
FormsAuthentication.RedirectFromLoginPage(UserName, false);//登录主页或跳转到刚刚请求的页面
}
}
else
{
Response.Write("用户名或密码错误!");
}
Conn.Close();
}
else if (UserRole == "member")
{
sqlLogin += "and UserRole='" + UserRole + "'";
SqlCommand Cmd = new SqlCommand(sqlLogin, Conn);
int result = Convert.ToInt32(Cmd.ExecuteScalar());
if (result > 0)
{
if (Roles.RoleExists(UserRole))
{
Roles.CreateRole(UserRole);
Roles.AddUserToRole(UserName, UserRole);
FormsAuthentication.RedirectFromLoginPage(UserName, false);
}
FormsAuthentication.RedirectFromLoginPage(UserName, false);
}
else
{
Response.Write("用户名或密码错误!");
}
Conn.Close();
}
}
6、其他页面基本上没有什么内容,只是用于测试,其中登录还有一些因素需要考虑,这里主要是说明如何使用Forms验证并结合Roles用户角色管理类来实现角色管理。
这是我做的一个用户角色管理的Demo,希望对学习asp.net的朋友有所帮助,如果有什么问题或更好的解决方案,大家可以交流交流。
Demo下载地址 :asp.net用户角色管理 运行环境:vs2008+Sql Server2005