Asp.Net实现FORM认证的一些使用技巧(必看篇)

2019-05-22 12:11:31于丽

第四步:实现不同目录的权限控制

上面,实现了记录用户登录信息的模拟登录过程,以及根目录下文件的访问控制。但是系统一般都会有多个目录,接下来就说说目录的访问控制。

其实,上面多多少少已经提到过了,通过在每个目录下增加Web.config文件来进行访问限制。

首先,我们在根目录增加一个文件夹ManageAdmin,在此文件夹内增加页面UserInfo.aspx,页面内放几个Label用来展现登录用户信息。

然后,再增加一个Web.config文件,配置内容如下:

<configuration>
  <appSettings/>
  <connectionStrings/>
  <system.web>
    <authorization>
      <allow users="Admin"></allow>
      <deny users="*"></deny>
    </authorization>
  </system.web>
</configuration>

配置中说明只允许“Admin”用户访问,禁止其他所有用户访问。

这里,特别要注意的是,FormsAuthenticationTicket票据的name属性的赋值,一定要和<allow users="Admin"></allow>设置的用户想对应,且大小写敏感。如果要设置允许多个用户访问,则用“,”隔开,例如<allow users="Admin,User1"></allow>。

不同的目录,设置不同的允许访问的用户,就可以对所有目录进行访问控制了。

第五步:实现不同目录的按角色的权限控制

以上实现了对不同目录按用户的访问限制。但是一般来说,一个网站系统的用户会很多,如果一直使用精确到用户的访问控制,则会造成设置Web.config的工作量加大。

而一般,我们会将用户分到不同的用户组来进行权限控制,因此,我们也可以配置Web.config实现按角色来控制不同的目录的访问权限。

首先,我们在根目录下再增加一个目录ManageUsers,在此文件夹内也增加页面UserInfo.aspx用来展现登录用户信息。此目录将模拟控制Users组的用户,文件夹ManageAdmin将模拟控制Administrators组的用户。

然后,在目录ManageUsers增加Web.config文件,配置内容如下:

<configuration>
  <appSettings/>
  <connectionStrings/>
  <system.web>
    <authorization>
      <allow roles="Users"></allow>
      <deny users="*"></deny>
    </authorization>
  </system.web>
</configuration>

再将文件夹ManageAdmin下的Web.config文件的<allow users="Admin"></allow>改成<allow roles="Administrators"></allow>。

最后,修改代码。

1、注意,我们在模拟用户信息的时候,有这么一句,user.Roles = "Administrators,Users";也就是用户Admin具备两种角色

2、为模拟Users组的用户登录,我们再添加如下代码:

if (this.TextBox1.Text == "User1" && this.TextBox2.Text == "111111")
{
      // 加密UserInfo
      UserInfo user = new UserInfo();
      user.Id = 2;
      user.Name = this.TextBox1.Text;
      user.Password = this.TextBox2.Text;
      user.RealName = "普通用户1";
      user.Roles = "Users";
      string strUser = Serialize.Encrypt<UserInfo>(user);

      // 设置Ticket信息
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1, user.Name, DateTime.Now, DateTime.Now.AddMinutes(20), false, strUser);

      // 加密验证票据
      string strTicket = FormsAuthentication.Encrypt(ticket);

      // 使用新userdata保存cookie
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strTicket);
      cookie.Expires = ticket.Expiration;
      this.Response.Cookies.Add(cookie);
      

      this.Response.Redirect("Default.aspx");
 }