第四步:实现不同目录的权限控制
上面,实现了记录用户登录信息的模拟登录过程,以及根目录下文件的访问控制。但是系统一般都会有多个目录,接下来就说说目录的访问控制。
其实,上面多多少少已经提到过了,通过在每个目录下增加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");
}








