检查每个页面的权限

本文关键字:权限 检查 | 更新日期: 2023-09-27 18:02:09

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

这是我的一个页面

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;

检查每个页面的权限

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

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

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

可以有很多方法,但我可以给你一些建议

  • 使用母版页-并在母版页的OnLoad
  • 中编写授权代码创建一个HttpModule——在ASP中插入你自己的模块。. NET Page Events PipeLine,处理所有的授权和认证逻辑

这是我在一个几百万美元的项目中所做的

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

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

where 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中的公共属性,因此可用于所有页面(无论您继承了)。你可以设置你的控件(添加按钮,删除按钮),基于这些变量的页面可见性。

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

  • Id
  • <
  • 名称/gh>
  • 父母

表中典型的表项如下:

  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 1拥有所有三个权限。

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

因此在每个页面上调用PageBase构造函数来验证视图权限。在构造函数中传递当前页面的AppActivity Id。如果CanView为false,则在点击url后重定向到"未经授权"页面。

我添加了所有页面都继承的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; }
    }

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