Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。
主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。
具体步骤:1、创建一个网站,结构如下:
网站根目录
Admin目录 ----> 管理员目录
Manager.aspx ----> 管理员可以访问的页面
Users目录 ----> 注册用户目录
Welcome.aspx ----> 注册用户可以访问的页面
Error目录 ----> 错误提示目录
AccessError.htm ----> 访问错误的提示页面
default.aspx ----> 网站默认页面login.aspx ----> 网站登录页面web.config ----> 网站配置文件
2、配置web.config如下:
<configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> <!--设置Forms身份验证--> <authentication mode="Forms"> <forms loginUrl="Login.aspx" name=".APSXAUTH" path="/" protection="All" timeout="30"/> </authentication> <authorization> <allow users="*"/> </authorization> </system.web> <!--设置Admin目录的访问权限--> <location path="Admin"> <system.web> <authorization> <allow roles="Admin"/> <deny users="?"/> </authorization> </system.web> </location> <!--设置Users目录的访问权限--> <location path="Users"> <system.web> <authorization> <allow roles="User"/> <deny users="?"/> </authorization> </system.web> </location> </configuration>
3、在login.aspx页面的登录部分代码如下:
html代码
<body> <form id="form1" runat="server"> 帐号:<asp:TextBox ID="txtName" runat="server"></asp:TextBox> 密码: <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="登录" onclick="btnLogin_Click" /> <br /> <br /> <br /> <br /> <a href="Admin/Manager.aspx">转到Admin</a> <br /> <br /> <a href="Users/Welcome.aspx">转到Users</a> </form> </body>
cs代码
protected void btnLogin_Click(object sender, EventArgs e)
{
string um = txtName.Text.Trim();
string uesrname = null; //用户名
//string password = null; //密码
string Roles = null; //角色字符串
if (um == "sa")
{
uesrname = "sa";
//password = "sa";
Roles = "Admin,User";
}
else if (um == "admin")
{
uesrname = "admin";
//password = "admin";
Roles = "Admin";
}
else
{
uesrname = "user";
//password = "user";
Roles = "User";
}
//Forms身份验证初始化
FormsAuthentication.Initialize();
//验证用户输入并得到登录用户,txtName是用户名称,txtPassword是登录密码
//UserModel um = ValidUser(uesrname, password);
if (um != null)
{
//创建身份验证票据
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
uesrname,
DateTime.Now,
DateTime.Now.AddMinutes(30),
false,
Roles,//用户所属的角色字符串
FormsAuthentication.FormsCookiePath);
//加密身份验证票据
string hash = FormsAuthentication.Encrypt(ticket);
//创建要发送到客户端的cookie
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
//if (ticket.IsPersistent)
//{
// cookie.Expires = ticket.Expiration;
//}
//把准备好的cookie加入到响应流中
Response.Cookies.Add(cookie);
//转发到请求的页面
if (um == "admin")
{
Response.Redirect("/admin/Manager.aspx");// 定向到某一个页面
}
else if (um == "user")
{
Response.Redirect("/Users/Welcome.aspx");// 定向到某一个页面
}
}
else
{
ClientScriptManager csm = this.Page.ClientScript;
csm.RegisterStartupScript(this.GetType(), "error_tip", "alert('用户名或密码错误!身份验证失败!');", true);
}
}
4、给网站添加处理程序Global.asax,其中通用身份验证代码如下:using System.Security.Principal; //改造原来的User,给其添加一个用户所属的角色数据 protected void Application_AuthenticateRequest(object sender, EventArgs e) { if (HttpContext.Current.User != null) { if (HttpContext.Current.User.Identity.IsAuthenticated) { if (HttpContext.Current.User.Identity is FormsIdentity) { FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; FormsAuthenticationTicket ticket = id.Ticket; string userData = ticket.UserData; string[] roles = userData.Split(','); //重建HttpContext.Current.User,加入用户拥有的角色数组 HttpContext.Current.User = new GenericPrincipal(id, roles); } } } }
5、在Admin目录中Manager.aspx页面加载代码如下:
html代码<form id="form1" runat="server"> <div> 登录【Admin】成功。。。。<br /> <br /> <br /> <asp:Button ID="Button1" runat="server" onclick="btnExit_Click" Text="退出" /> <br /> <br /> <a href="../Users/Welcome.aspx">转到Users</a> </div> </form>
cs代码using System.Web.Security; protected void Page_Load(object sender, EventArgs e) { //判断通过身份验证的用户是否有权限访问本页面 FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; //判断通过身份验证的用户是否是Admin角色 if (!id.Ticket.UserData.Contains("Admin")) { //跳转到访问权限不够的错误提示页面 Response.Redirect("~/Error/AccessError.htm", true); } } //安全退出按钮的代码 protected void btnExit_Click(object sender, EventArgs e) { //注销票据 FormsAuthentication.SignOut(); ClientScriptManager csm = this.Page.ClientScript; csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已经安全退出了!');", true); }
6、在Users目录中Welcome.aspx页面加载代码如下:
html代码<form id="form1" runat="server"> <div> 登录【Users】成功。。。。<br /> <br /> <br /> <asp:Button ID="Button1" runat="server" onclick="btnExit_Click" Text="退出" /> <br /> <br /> <a href="../Admin/Manager.aspx">转到Admin</a> </div> </form>
cs代码using System.Web.Security; protected void Page_Load(object sender, EventArgs e) { //判断通过身份验证的用户是否有权限访问本页面 FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; //判断通过身份验证的用户是否是User角色 if (!id.Ticket.UserData.Contains("User")) { //跳转到访问权限不够的错误提示页面 Response.Redirect("~/Error/AccessError.htm", true); } } //安全退出按钮的代码 protected void btnExit_Click(object sender, EventArgs e) { //注销票据 FormsAuthentication.SignOut(); ClientScriptManager csm = this.Page.ClientScript; csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已经安全退出了!');", true); }
7、在Error目录中AccessError.htm页面加载代码如下:
<body> <p>拒绝访问.....返回登录<a href="../login.aspx">Login.aspx</a></p> </body>
测试结果:
数据:
假设有3个用户,如下:
------------------------------------------
用户名 密码 角色字符串
------------------------------------------
sa sa Admin,User
admin admin Admin
user user User
------------------------------------------
测试:
如果使用admin登录,只能访问Admin目录的Manager.aspx页面;
如果使用user登录,只能访问Users目录的Welcome.aspx页面;
使用sa登录,既能访问Admin目录的Manager.aspx页面,又能访问Users目录的Welcome.aspx页面。
注意:测试时注意及时点击安全退出按钮,否则影响测试结果。