asp.net 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页面。

  注意:测试时注意及时点击安全退出按钮,否则影响测试结果。