检查每个页面的权限

时间:2013-03-05 07:27:09

标签: c# asp.net

在我的网站上我需要检查每个页面的权限, 我发现每个页面都重复相同的代码。

这是我的一个页面

public partial class KitView : AmsBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IddUser user = new IddUser();
        user = (IddUser)Session["user"];

        bool isAdmin = user.roles.Where(IddRole => IddRole.R_ID.Equals(3)).First().IsInRole;
        bool isIddTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(2)).First().IsInRole;
        bool isProductionTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(1)).First().IsInRole;

        if (isAdmin)
        {
            hypAddComponent.Visible = true;
            hypAddComponent.NavigateUrl = "AddComponent.aspx?CKID=" + Request.QueryString["CKID"];
        }



    }
}

拥有角色的最佳做法是:isAdmin,isIddTeam,isProductionTeam 在每个页面中但不在每个页面代码中重复下面的代码

IddUser user = new IddUser();
        user = (IddUser)Session["user"];

        bool isAdmin = user.roles.Where(IddRole => IddRole.R_ID.Equals(3)).First().IsInRole;
        bool isIddTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(2)).First().IsInRole;
        bool isProductionTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(1)).First().IsInRole;

5 个答案:

答案 0 :(得分:3)

您应该将授权代码放在母版页(ASP.NET Web窗体)或布局页面(ASP.NET MVC)中。这样,您的授权逻辑将只放在一个位置并在每个页面上运行。

答案 1 :(得分:1)

  

如果您想避免使用冗余代码,我建议您将authorization逻辑写入sepearte class,或者甚至可以在aurthorization中编写MasterPage逻辑如果你有任何。然后在webforms中继承它们   注意:在webforms中,您必须override发送page_load事件,以便继承基类的authorization先运行。

答案 2 :(得分:1)

如果您想避免重复授权代码,则应在中心位置进行。

可以有很多方法,但我可以建议你很少

  • 使用母版页 - 并在母版页的OnLoad中编写授权码
  • 创建HttpModule - 在ASP.NET页面事件PipeLine中插入您自己的模块并处理所有授权和身份验证逻辑

现在这就是我在一个价值数百万美元的项目中做的事情

  • 创建一个继承自System.Web.UI.Page的PageBase.cs - 您已经在做的
  • 创建PageBase的构造函数,您可以在其中传递当前的页面权限,即

     public void PageBase(AppActivityEnum PageView, AppActivityEnum PageEdit, AppActivityEnum PageDelete)
    {
      this.pageView = PageView;
      this.pageEdit=PageEdit;
      this.PageDelete=PageDelete;
    
      VerifyPermission();
    }  
    

其中VerifyPermission()是:

     public void VerifyPermission()
    {
        var currentUser= SessionHelper.GetCurrentUser();
        var permissions = Utility.GetUserPermissions(currentUser.RoleId);

            this.CanView=permissions.Contains((int)this.pageView);

            this.CanEdit=permissions.Contains((int)this.pageEdit);

            this.CanDelete=permissions.Contains((int)this.pageDelete);

    }

现在这三个变量,即CanView, CanEdit, CanDeletePageBase中的公共属性,因此可用于您的所有页面(无论您在哪里继承)。 您可以根据这些变量设置控件(添加按钮,删除按钮),页面可见性。

所以基本上,你创建一个活动表来存储每个页面的引用。活动表看起来像

  • 编号
  • 名称

此表中的典型条目如下:

  1 Module-Master           MMaster       NULL 
  2 Module-Master-View      MMasterView    1 
  3 Module-Master-Edit      MMasterEdit    1 
  4 Module-Master-Delete    MMasterDelete  1

并且您维护RoleAppActivtyMapping(显然):

 Id   RoleId  AppActivityId
   1    1        2
   1    1        3
   1    1        4

所以RoleId拥有所有三种权限。

所以GetUserPermissions(RoleId)基本上获得了与传递的角色相对应的所有RoleAppActivityMapping条目。

所以在每个页面上调用PageBase的构造函数来验证视图权限。您在构造函数中传递当前Page的AppActivity Id。 如果CanView为false:您在点击网址时会重定向到“UnAuthorized”页面。

答案 3 :(得分:0)

我在我的AmsBasePage类中添加了所有页面继承的内容。 这段代码

private bool _isAdmin;
    private bool _isIddTeam;
    private bool _isProductionTeam;




    protected bool isAdmin
    {
        get { return _isAdmin; }
        set { _isAdmin = value; }
    }

    protected bool isIddTeam
    {
        get { return _isIddTeam; }
        set { _isIddTeam = value; }
    }

    protected bool isProductionTeam
    {
        get { return _isProductionTeam; }
        set { _isProductionTeam = value; }
    }

答案 4 :(得分:0)

在母版页中检查您的授权。这样,我会被检查一次,可以避免重复。