2

我是使用 Asp.NET 成员功能的新手,我想知道使用如下代码拒绝访问整个页面是否是一个好习惯:

public partial class AdminPage : Page
{
   [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
   protected void Page_Load(object sender, EventArgs e)
   {
      ...
   }
}

我怀疑这不是做事的好方法,但我想知道为什么!

谢谢。

4

2 回答 2

1

小点——把属性放在类上。一旦您在没有适当权限的情况下导航到该页面,这将导致页面引发安全异常。要阻止用户查看此页面,请在显示 URL 之前检查他们的凭据。类上的属性是一个强有力的保证,普通用户不会运行该类中的一行代码。

是的,这是一个很好的技术,原因如下:

该属性在设置线程原则和 HttpContext User 对象时起作用,具有合适的 IPrincipal 和 IIdentity。(所有这些都将发生在全局 asax 中的 Request Authentication 事件中)这些接口由 Microsoft 定义,有据可查,可在任何上下文、在 MS 操作系统上运行的任何应用程序中使用。因此,您在街上抓到的任何半胜任的开发人员都可能在他们开始阅读您的代码之前熟悉这一点。

此外,由于微软使用了 Thread 的 IPrincipal 和 IIdentity(它可能是任何拥有大量用户群的大公司),它是经过实战考验的代码。您仍然可以做一些愚蠢的事情,但是现有的模式可以帮助您陷入成功的陷阱。

另一方面,如果您将自定义对象放入 Session、magic cookie 或其他令牌中,则维护开发人员必须从头开始了解它的工作原理,然后对其进行检查以查看是否存在可利用的漏洞。

于 2011-10-14T12:45:12.320 回答
0

我认为您的所有页面都需要一个基类,例如:

public abstract class BasePage : Page
{
    // Note:
    // 1. check on init, not on load
    // 2. override protected method, not handle event
    protected override OnInit(EventArgs e)
    {
        // check permissions here
    }
}
于 2011-10-14T08:50:02.007 回答