在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法

  很多用户在开发 ASP.NET 应用程序时都有这样的需求:管理员角色的账户使用管理员的登录界面进行登录,普通用户角色的账户使用普通用户的登录界面进行登录。由于ASP.NET的web.config里只能使用一个 authentication mode="Forms"节点,所以,要实现不同用户采用不同的登录界面,一个办法就是创建一个管理员专用的虚拟目录,并设置为应用程序来实现。下面介绍另外一种采用重定向的办法来解决这个问题。
  本文介绍的方法原理是根据登录界面的返回地址进行判断,然后重定向到不同的页面。下面就是实现的详细过程。

  1. 创建一个网站,在网站里创建Admin文件夹和User文件夹,分别存放admin和普通用户所使用的文件。也可以只设置一个 Admin 文件夹。由于本方法采用的判断返回路径的方法,所以,要能从路径中区分出哪些是admin用户使用的文件夹。当然,采用其他的判断方法也是可以的。

  2. 在网站根目录下分别创建3个登录文件:Login.aspx、UserLogin.aspx和AdminLogin.aspx。其中Login.aspx文件起地址转换的作用,
  Login.aspx文件的主要内容:

protected void
Page_Load(object sender, EventArgs e){String ReturnUrl = Request.QueryString["ReturnUrl"];if (ReturnUrl == null || ReturnUrl.Equals(String.Empty)){ //默认情况下,按普通用户进行登录 Response.Redirect("~/UserLogin.aspx");}else{ if (ReturnUrl.ToLower().Contains("/admin/")) { Response.Redirect("~/AdminLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl)); } else { Response.Redirect("~/UserLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl)); }}

  在这个文件的代码中,如果ReturnUrl中含有"/admin/",就重定向到AdminLogin.aspx登录界面;否则,就重定向到 UserLogin.aspx登录界面。

  UserLogin.aspx这个文件的内容如下:

<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><mce:script runat="server"><!-- protected void Button1_Click(object sender, EventArgs e) { //密码验证过程在此省略,假如用户名是mxh,密码是mengxianhui String UserName = "mxh"; Forms
AuthenticationTicket ticket = new FormsAuthenticationTicket(2,//票证的版本号 UserName,//与身分验证票关联的用户名 DateTime.Now, //票证发出时的本地日期和时间 DateTime.Now.AddHours(1),//票证过期的本地日期和时间 true,// 如果票证存储在持久性cookie中(跨浏览器会话保存)则为 true 否则为false 如果票证储存在URL中,将
忽略此值 "reader",//储存在票证中持定的用户信息,本页面供 reader 登录使用 FormsAuthentication.FormsCookiePath //票证储存在cookie中的路径 ); //如果 forms 元素的 protection 属性设置为 All 或 Encryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。 string encTicket = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); Response.Cookies.Add(cookie); Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true)); }// --></mce:script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title>孟宪会之多用户登录测试页面</title></head><body> <form id="form1" runat="server"> 普通用户登录界面省略<br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="普通用户登录" /> </form></body></html>

  这个文件将验证信息保存后,返回最初的请求页面。注意:这里连接数据库验证用户名和密码的过程省略过去了。

  AdminLogin.aspx这个文件的全部内容如下:

<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><mce:script runat="server"><!-- protected void Button1_Click(object sender, EventArgs e) { //密码验证过程在此省略,假如用户名是Admin,密码是mengxianhui FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,//票证的版本号 "Admin",//与身分验证票关联的用户名 DateTime.Now, //票证发出时的本地日期和时间 DateTime.Now.AddHours(1),//票证过期的本地日期和时间 true,// 如果票证存储在持久性cookie中(跨浏览器会话保存)则为 true 否则为false 如果票证储存在URL中,将忽略此值 "admin|manager|editor",//储存在票证中持定的用户信息,本页面供 admin,manager,editor登录使用 FormsAuthentication.FormsCookiePath //票证储存在cookie中的路径 ); //如果 forms 元素的 protection 属性设置为 All 或 Encryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。 string encTicket = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); Response.Cookies.Add(cookie); Response.Redirect(FormsAuthentication.GetRedirectUrl("Admin", true)); }// --></mce:script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title>孟宪会之多用户登录测试页面</title></head><body> <form id="form1" runat="server"> 管理员登录界面,省略 <asp:Button ID="Button1" runat="server" Text=" 登 录 " OnClick="Button1_Click" /> </form></body></html>

注意:这里连接数据库验证用户名和密码的过程省略过去了。

  3. 在Global的AuthenticateRequest 事件(一定要注意:不是 AuthorizeRequest 事件)里将角色信息附加到当前用户的上下文中。

protected void
Application_AuthenticateRequest(object sender, EventArgs e) { string cookieName = FormsAuthentication.FormsCookieName; HttpCookie authCookie = Context.Request.Cookies[cookieName]; if (null == authCookie) { return; } FormsAuthenticationTicket authTicket = null; try { authTicket = FormsAuthentication.Decrypt(authCookie.Value); } catch (Exception ex) { return; } if (null == authTicket) { return; } FormsIdentity id = new FormsIdentity(authTicket); String[] roles = id.Ticket.UserData.Split('|'); //读出在登录时设置的角色列表。 System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles); Context.User = principal;//将验证信息附加到当前用户上下文。 }

  4. 在web.config文件中,允许登录文件的匿名访问,以便在未登录的情况下显示登录界面,注意:如果包含图片、css等文件,也需要设置这些资源允许匿名访问。

<configuration> <location path="AdminLogin.aspx"> <system.web> <authorization> <allow users="?"/> </authorization> </system.web> </location> <location path="UserLogin.aspx"> <system.web> <authorization> <allow users="?"/> </authorization> </system.web> </location> <system.web> <authentication mode="Forms"> <forms loginUrl="Login.aspx" path="/" protection="Encryption"></forms> </authentication> <authorization> <deny users="?"/> <allow users="*"/> </authorization> </system.web></configuration>

  5. 这样,当访问admin文件夹下的内容时,会直接转到AdminLogin.aspx界面。在登录之后,就可以在/Admin/文件夹下的页面中使用下面的方法得到当前登录的用户名和所具有的角色,根据角色来判断当前用户是否有权操作:

Response.Write("<li>当前登录用户 = " + Page.User.Identity.Name);Response.Write("<li>admin = " + Page.User.IsInRole("admin"));Response.Write("<li>reader = " + Page.User.IsInRole("reader"));

为了简单起见,可以写一个Admin使用的基类页面,统一在基类页面中进行权限的处理。

时间: 2024-10-07 04:48:51

在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法的相关文章

asp.net中使用基于角色的身份Forms验证,大致分为四个步骤

asp.net asp.net中使用基于角色的身份Forms验证,大致分为四个步骤1.配置系统文件web.config<system.web> <authentication mode="Forms" >  <forms name=".yaoCookies" loginUrl="/duan/Manage/login.aspx" protection="All"  timeout="20&

Asp.net中使用文本框的值动态生成控件的方法_实用技巧

看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个"花"字,点一下"生成"按钮,就会在下面生成一个checkbox,它的text属性是"花".再输入一个"鸟",点一下按钮,就会生成第二个checkbox控件,text属性是"鸟"... Insus.NET的解决方法很简单,就是每次在文本框输入的值都存起来,然后把这些数据绑定至一个CheckBoxList控件上就行了. 详细,先创建

asp.net中button控制先执行js再执行后台程序的方法_实用技巧

本文实例讲述了asp.net中button控制先执行js再执行后台程序的方法.分享给大家供大家参考.具体分析如下: 在.net中要实现button控制点击之后先执行js再执行后台程序这个看上去没什么难度,这里我们就一起来看一个asp.net中button控制先执行js再执行后台程序的实现方法,希望可以帮助到各位. 关于button这个服务器控件,我一直想减少它向服务器提交数据.那些检测,还是在客户端实现就好了. 这就需要javascript,但是我发现仅仅有javascript还是不够的.but

在C/S中怎么注销掉程序,退出到登录界面

问题描述 在C/S中怎么注销掉程序,退出到登录界面 public override void OnClick() { if (StaticSystemUIClass.MsgControl.ShowQuestionDialogHasYesNoButton("请确认是否需要退出当前登录名?rnrn确认请单击是,取消请单击否.") != System.Windows.Forms.DialogResult.Yes) return; // System.Diagnostics.Process.G

求助,asp.net中,js调com组件出现不支持属性或方法

问题描述 现在需要在js中调用C#的dll,查询网上的资料后说需要编写com组件,于是先写了个简单的com组件做测试,但是asp.net中的js调用时一直报错"对象不支持属性或方法"代码是这样的接口:[ComVisible(true)][Guid("2CBD3D76-35F1-4f9d-9C1B-9DBFEE412F76")]publicinterfaceIHello{stringShowHello();}接口的实现[ComVisible(true)][Guid(&

实例说明asp.net中的简单角色权限控制_实用技巧

角色表+用户表,其中Hope_T_User(用户)中的User_RoleId关联Hope_T_Role(角色)的Role_Id,表中字段均为简单常见英文,不作详解. 主要思路是使用公共类在其中根据角色得出其越权时的操作,然后后台所有需要验证权限的页面均继承此类,使用相应参数判断角色以做相应操作. 公共类:AdminPermission 复制代码 代码如下: /// <summary> /// AdminPermission角色权限验证类 /// </summary> public

asp.net中TextBox只能输入数字的最简洁的两种方法_实用技巧

如下TextBox 复制代码 代码如下: <asp:textboxonkeypress="isnum()"id="TextBox1"runat="server"></asp:textbox> 1. 在页面中添加一段脚本: 复制代码 代码如下: <scriptlanguage="javascript">functionisnum(){if(event.keyCode<45||event.

Asp.net中的GridView导出遇到的两个问题和解决方法_实用技巧

对于GridView导出的内容的代码大致如下: Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls"); Response.ContentEncoding = Sys

asp.net中ListBox 绑定多个选项为选中及删除实现方法_实用技巧

我们先来看listbox绑定多选项实现 复制代码 代码如下: <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"