页面加载的PrincipalPermission

时间:2011-10-14 08:44:25

标签: c# .net asp.net asp.net-membership declarative-authorization

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

是的,出于以下原因,这是一项很好的技术:

当使用合适的IPrincipal和IIdentity设置线程原则和HttpContext User对象时,该属性有效。 (所有这些都会发生在全局asax中的请求身份验证事件中)这些接口由Microsoft定义,有详细记录,可在任何上下文中使用,在MS操作系统上运行的任何应用程序。所以,在你开始阅读你的代码之前,你抓住街道的任何半职业开发人员都可能熟悉这一点。

此外,由于线程的IPrincipal和IIdentity被微软使用(它可能是任何拥有大量用户群的大型公司),因此它是经过测试的代码。你仍然可以做一些愚蠢的事情,但现有的模式可以帮助你陷入成功之中。

另一方面,如果要将自定义对象放入Session,魔术cookie或其他令牌,那么维护开发人员必须从头开始学习它是如何工作的,然后检查它以查看是否存在可利用的漏洞。

答案 1 :(得分: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
    }
}