调用堆栈中应该进行角色检查的位置?

Mat*_*tin 5 .net security rbac role-base-authorization

在我的典型应用程序中,用户单击aspx页面中的按钮,调用C#业务对象,然后运行存储过程.

是应该在堆栈顶部,堆栈底部还是每个级别进行角色检查?似乎如果恶意用户可以调用一个方法,他可以调用任何方法,因此为了有效的安全性,您需要检查每个方法(并且这需要编写很多额外的代码).

这是一个典型的调用堆栈来说明我的问题:

Page_Load()
{
  if(p.IsInRole("Managers"))  //or equivalent attribute
  {
    AddAccount.Visible =true;
  }
}

AddAccount_OnClick()
{
  if(p.IsInRole("Managers"))  //or equivalent attribute
  {
    //Add the account
    Account.Add(...);  //and maybe another role check...
  }
}

-- TSQL doesn't understand .NET authorization, this call is in a 'trusted' subsystem
create proc Add_Account @user, @account_name
If @user in (Select user from role_table where role='manager')
-- Add the account
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 3

在我看来,你应该让它尽可能接近数据。您距离数据越近,就越能确保不可能通过代码库采取一些迂回路线来规避访问检查。

该论点要求在数据源本身(如果支持的话)(如您最喜欢的 RDBMS)或数据访问层中进行安全检查。

然而,一些安全约束带有强烈的业务逻辑味道;例如“如果用户处于此角色并尝试修改满足这些规范的数据,则应允许该操作;否则不允许”。在我看来,这听起来像是一个策略,并且属于某种单独的规则引擎的业务逻辑层。

我不久前在 WCF 的上下文中写过类似的内容