在我的网站上我需要检查每个页面的权限, 我发现每个页面都重复相同的代码。
这是我的一个页面
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;
答案 0 :(得分:3)
您应该将授权代码放在母版页(ASP.NET Web窗体)或布局页面(ASP.NET MVC)中。这样,您的授权逻辑将只放在一个位置并在每个页面上运行。
答案 1 :(得分:1)
如果您想避免使用冗余代码,我建议您将
authorization
逻辑写入sepearteclass
,或者甚至可以在aurthorization
中编写MasterPage
逻辑如果你有任何。然后在webforms
中继承它们 注意:在webforms
中,您必须override
发送page_load
事件,以便继承基类的authorization
先运行。
答案 2 :(得分:1)
如果您想避免重复授权代码,则应在中心位置进行。
可以有很多方法,但我可以建议你很少
现在这就是我在一个价值数百万美元的项目中做的事情
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, CanDelete
是PageBase
中的公共属性,因此可用于您的所有页面(无论您在哪里继承)。
您可以根据这些变量设置控件(添加按钮,删除按钮),页面可见性。
所以基本上,你创建一个活动表来存储每个页面的引用。活动表看起来像
此表中的典型条目如下:
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)
在母版页中检查您的授权。这样,我会被检查一次,可以避免重复。