我是Asp.NET成员功能的新手,我想知道使用这样的代码拒绝整个页面的访问是否是一种好的做法:
public partial class AdminPage : Page
{
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
protected void Page_Load(object sender, EventArgs e)
{
...
}
}我怀疑这不是做事情的好方法,但我想知道为什么!
谢谢。
发布于 2011-10-14 20:45:12
小问题--将属性放在类上。这将导致页面在您没有适当权限的情况下导航到该页面时立即引发安全性异常。若要禁止用户查看此页面,请在显示URL之前检查其凭据。类上的属性是一个强有力的保证,即普通用户不会在该类中运行一行代码。
是的,这是一个很好的技术,原因如下:
该属性在设置了线程原理和HttpContext用户对象并具有合适的IPrincipal和IIdentity时起作用。(所有这些都会在全局asax中的请求身份验证事件中发生)这些接口是由Microsoft定义的,并且在任何上下文中都可用,在MS操作系统上运行的任何应用程序都可以使用。因此,在开始阅读您的代码之前,您从街道上抓取的任何不太称职的开发人员都可以熟悉这一点。
此外,由于线程的IPrincipal和IIdentity由微软使用(它可能是任何拥有大量用户的大公司),它是经过战斗测试的代码。你仍然可以做一些愚蠢的事情,但现有的模式会帮助你陷入成功的深渊。
另一方面,如果您将自定义对象放入会话、魔术cookie或其他令牌中,那么维护开发人员将不得不从头开始了解它的工作原理,然后检查它是否有可利用的漏洞。
发布于 2011-10-14 16:50:02
我认为你的所有页面都需要一个基类,例如:
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
}
}https://stackoverflow.com/questions/7765137
复制相似问题