身份验证

来自:http://www.pqshow.com/design/Print.asp?ArticleID=10865

 

主要思想: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页面。
 注意:测试时注意及时点击安全退出按钮,否则影响测试结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值