FORMS权限验证

主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。
具体步骤:
	1、创建一个网站,结构如下:
		网站根目录
			Admin目录			---->	管理员目录
				Manager.aspx		---->	管理员可以访问的页面
			Users目录			---->	注册用户目录
				Welcome.aspx		---->	注册用户可以访问的页面
			Error目录			---->	错误提示目录
				AccessError.htm		---->	访问错误的提示页面
			default.aspx			---->	网站默认页面
			login.aspx			---->	网站登录页面
			web.config			---->	网站配置文件
	2、配置web.config如下:
		<configuration>
			<system.web>
				<!--设置Forms身份验证-->
				<authentication mode="Forms">
					<forms loginUrl="Login.aspx" name="MyWebApp.APSXAUTH" path="/" protection="All" timeout="30"/>
				</authentication>
				<authorization>
					<allow users="*"/>
				</authorization>
			</system.web>
		</configuration>

		<!--设置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>
	3、在login.aspx页面的登录部分代码如下:
		protected void btnLogin_Click(object sender, EventArgs e)
		{	
			//Forms身份验证初始化
			FormsAuthentication.Initialize();
			//验证用户输入并得到登录用户,txtName是用户名称,txtPassword是登录密码
			UserModel um = ValidUser(txtName.Text.Trim(),txtPassword.Text.Trim());
			if (um != null)
			{
			    //创建身份验证票据
			    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
											um.Name,
											DateTime.Now,
											DateTime.Now.AddMinutes(30),
											true,
											um.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);
			    
			    //转发到请求的页面
			    Response.Redirect(FormsAuthentication.GetRedirectUrl(um.Name,false));
			}
			else
			{
			    ClientScriptManager csm = this.Page.ClientScript;
			    csm.RegisterStartupScript(this.GetType(), "error_tip", "alert('用户名或密码错误!身份验证失败!');", true);
			} 
		}	
		//验证用户
		private UserModel ValidUser(string name, string password) 
		{
			return new UserService().Validate(name, password);
		}
	4、给网站添加处理程序Global.asax,其中通用身份验证代码如下:
		//改造原来的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页面加载代码如下:
		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页面加载代码如下:
		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);
		}
测试结果:
	数据:
		假设有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页面。
	注意:测试时注意及时点击安全退出按钮,否则影响测试结果。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值