现在的位置: 首页 > 综合 > 正文

如何控制用户授权

2013年01月07日 ⁄ 综合 ⁄ 共 2445字 ⁄ 字号 评论关闭

1、使用ASP.Net自带的权限管理

在web.config文件中修改以下的内容:

<authentication mode="Forms">
<forms name=".ASPXUSERDEMO" loginUrl="login.aspx" protection="All" timeout="60" />
</authentication>
<authorization>
<deny users="?" />
</authorization>

2.在login.aspx中如果用户名和密码正确则给予验证:

FormsAuthentication.SetAuthCookie(TextBox_name.Text,false); //在本页
FormsAuthentication.RedirectFromLoginPage(TextBox1.Text,false); //转到操作页

3.退出验证:

FormsAuthentication.SignOut();

4.获得当前用户的名字:

User.Identity.Name;

评点:该方法非常简单、便捷和易于管理,你只要将需要验证页面放在该文件夹就可以了,但是该方法只能在做简单的用户管理时使用,因为它只有匿名用户和非匿名用户的划分,不能对多级用户进行划分。

2、使用XML配置网站用户权限

该方法是昨天那位面试官提的一种方法,就是在每个目录下面建立一个XML权限配置文件,当用户需要访问这个目录的文件时,通过读取该XML文件信息来判断该用户是否有权限访问。

评点:本人认为该方法显然不易于维护和管理,在文件夹比较多且权限组较多时,很容易造成混乱,而且在用户访问该文件下任何一个文件时都需要读取XML文件来判断,那么就需要在每个文件中都加入权限判断操作的代码。

3、使用数据库标记方式

这也许是我们最常用到的方式,许多的大型系统都采用的这样的做法,一般就建立一张权限表,比如:

权限组名称(角色)

 权限

该表需要记录多个权限组,比如超级管理员、管理员、用户等,每个权限组设置不同的权限,然后再将某用户隶属于该权限组,甚至也可以在用户表中对某用户的权限进行单独设置,用户权限从用户组权限继承以外,然后还需包括自己的私有权限。

评点:该方法的可扩展性很强,基本上可以完成所有权限管理需要的操作,但是它也有不好的地方,那就是在用户进行某项操作之前,你都需要在程序中加入权限判断的操作,才能返回“允许”或“拒绝”操作的指令,这样显然不易于管理,而且权限的层次结构在程序中不清晰,维护也不方便。

4、使用URL参数+Controls层实现网站用户权限

本方法其实是第3种方法的改进,将ASP.Net中Controls层结构与程序中的用户权限层结构相结合,利用URL 参数标记字段,当然也可以使用ViewState来标记,具体实现方法如下:

网站中只有一个.aspx页,在页中加入一个PlaceHolder控件,然后在Page_Load中加入:

if (Action == null)
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Default.ascx"));
}
else if (Action == "Manage")
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Manage.ascx"));
}
else if (Action == "Help")
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Help.ascx"));
}
... ...

用URL参数标记当前的用户操作位置,然后显示相应的内容,比如Manage.ascx中的内容只能管理员以上的用户才能访问,则在Manage.ascx的Page_Load中加一个权限判断当前用户是否拥有访问权限,在M anage.ascx中有“用户管理”、“地区管理”、“文章管理”等多个栏目,而只有超级管理员能进行“地区管理”。URL标记如下:

用户管理:Default.Aspx?Action=Manage&Sort=User

文章管理:Default.Aspx?Action=Manage&Sort=Article

地区管理:Default.Aspx?Action=Manage&Sort=Area

需要在Manage.ascx中添加一个PlaceHolder控件,判断Sort参数显示相应的Control内容,如下:
 
if (Sort=="User")
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/User.ascx"));
}
else if (Sort== "Article")
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Article.ascx"));
}
else if (Sort== "Area")
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Area.ascx"));
}

你只需要在“地区管理”的文件中加入一个权限判断当前用户是否为超级管理员。在“用户管理”以及“文章管理”的文件中就不需要判断用户权限。

评点:在Default层中允许所有用户访问,同时包括Help.ascx等,在Manage层只允许管理员以上的用户访问,而在Area层则只允许超级管理员访问,使用该方法的优点就是无需在每一个页面添加权限判断的操作,而是在一个Controls层添加一个权限判断的操作,而且权限与程序的结构层次清晰,易于维护与管理,它不基于应用程序的目录级,而是基于ASP.net的Controls层方式,比如需要进入Area层,就必须先进入Manage层,而User层就无须在进行权限的判断。

 

抱歉!评论已关闭.