1

在我的网站中,我需要检查每一页的权限,我发现我自己每页都重复相同的代码。

这是我的一页

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;
4

5 回答 5

3

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

于 2013-03-05T07:49:33.300 回答
1

如果您想避免冗余代码,我建议您将authorization逻辑单独class编写,或者您甚至可以将aurthorization逻辑编写在 a 中(MasterPage如果有的话)。然后在你的webforms.
注意:在您的事件中,您webforms必须先运行来自继承的基类的事件。overridepage_loadauthorization

于 2013-03-05T07:49:24.263 回答
1

如果你想避免重复授权码,你应该在一个中心位置进行。

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

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

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

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

     public void PageBase(AppActivityEnum PageView, AppActivityEnum PageEdit, AppActivityEnum PageDelete)
    {
      this.pageView = PageView;
      this.pageEdit=PageEdit;
      this.PageDelete=PageDelete;
    
      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);

    }

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

所以基本上,您创建一个活动表来存储每个页面的参考。活动表的样子

  • ID
  • 姓名
  • 价值
  • 家长

此表中的典型条目如下:

  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 为假:您在点击 url 时重定向到“UnAuthorized”页面。

于 2013-03-05T08:02:52.157 回答
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; }
    }
于 2013-03-05T07:54:51.603 回答
0

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

于 2013-03-05T08:00:24.970 回答