在实际开发中,权限相关信息应该存储在数据库之中,从而提高系统的安全性,上面几个小节主要介绍了ASP.NET安全机制的相关操作,本节将结合Sql Server 2005完善ASP.NET安全机制,是系统更加健壮。 本节使用的权限表Roles和用户表Users的表结构如下: 表2 Roles表 表3 Users表
结合数据库实现ASP.NET权限控制的大体步骤如下: 1. 使用VS2008创建网站“RolesManager”。 2. 在网站根目录创建Login.aspx页面、Admin文件夹和Common文件夹。 3. 分别在两个文件夹中添加web.config,并按照下图所示添加相应权限控制语句。 4. 分别在两个文件夹中添加Default.aspx页面,输出登陆成功提示信息。 5. 接收用户在页面上输入的用户名和用户密码,形成检索数据库的SQL语句。 6. 如果用户信息输入正确,检索数据库获得该用户名对应的角色ID。 7. 通过角色ID,检索数据库获得该角色ID对应的角色名称。 8. 利用Roles类将该登录帐户的用户名和角色名添加到系统中保存起来。 9. 利用 Roles类将当前角色与web.config配置信息进行对比达到权限控制的目的。
分析上图不难得出结论:具有Admin角色的用户(小强)能访问Admin文件夹及Common文件夹下的资源,具有Common角色用户(water)仅能访问Common文件夹下的资源 。 Roles类可以管理角色中的用户成员资格,以便在 ASP.NET 应用程序中进行授权检查。 Roles类的常用方法如下所示: | | | | | | | | | | | | | | | 判断指定的角色名称是否已存在于角色数据源中,返回bool。 |
表4 Roles类的常用方法 | 使用Roles类进行权限控制,需要在web.config文件中加入<roleManager enabled="true"></roleManager>节点。 |
代码演示: 结合数据库完善ASP.NET安全机制 - protected void Button1_Click(object sender, EventArgs e)
- {
- //用户输入的用户名
- string name = this.TextBox1.Text;
- //用户输入的密码
- string pwd = this.TextBox2.Text;
- //权限名称
- string role = "";
- //形成数据库检索语句
- string sql = "select * from users where userName='" + name + "' and pwd='" + pwd + "'";
- //获得用户信息
- DataTable dt = SQLHelper.GetData(sql);
- //判断用户名是否存在
- if (dt.Rows.Count == 0)
- {
- return;
- }
- //获得该用户的权限编号
- int roleId = Convert.ToInt32(dt.Rows[0][3]);
- string s = "select * from roles where id=" + roleId;
- //获得权限信息
- DataTable dtRole = SQLHelper.GetData(s);
- //判断权限信息是否存在
- if (dtRole.Rows.Count == 0)
- {
- return;
- }
- //获得权限名称
- role = dtRole.Rows[0][1] as string;
- //在系统数据库中标识当前登录的用户名及对应的角色
- if (Roles.RoleExists(role) == false) ①
- {
- Roles.CreateRole(role); ②
- }
- if (Roles.IsUserInRole(name, role) == false)
- {
- //将name用户标识为角色role
- Roles.AddUserToRole(name, role);
- }
- //添加票证
- System.Web.Security.FormsAuthentication.SetAuthCookie(name, false);
- //跳转到原页面
- Response.Redirect(FormsAuthentication.GetRedirectUrl(name,false));
- }
复制代码
代码解析: ① Roles类是ASP.NET管理用户角色类,有验证角色资格、创建角色等方法。由Roles类创建的角色可以与web.config配置节进行对比,从而实现权限控制。 ② Roles类的创建角色方法。 |