我正在使用ASP.NET登录控件和表单身份验证作为ASP.NET Web应用程序的成员身份/凭证。
我有两个角色:
我希望页面可以被四个不同的组查看:
-
所有人(默认,帮助)
-
匿名(CreateUser,登录名,PasswordRecovery)
-
用户(ChangePassword,DataEntry)
-
管理员(报告)
在"我如何学习视频系列:成员资格和角色"中的示例上进行扩展,我将这些页面文件放入以下文件夹中:
而且我使用ASP.NET网站管理工具来设置每个文件夹的访问规则。
它可以工作,但对我来说似乎有点麻烦,当Login.aspx不在根目录中并且使用Login.aspx的ReturnUrl参数时,它会产生问题。
有一个更好的方法吗?我可以在页面级别而不是文件夹级别设置权限吗?
在母版页中,我定义了一个公共属性,用于切换安全检查,默认为true。我还声明了一个字符串;该页面所需的角色的分隔列表。
在我的母版页加载中,请执行以下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| if (_secure)
{
if (Request.IsAuthenticated)
{
if (_role.Length > 0)
{
if (PortalSecurity.IsInRoles(_role))
{
return;
}
else
{
accessDenied = true;
}
}
else
{
return;
}
}
}
//do whatever you wanna do to people who dont have access.. bump to a login page or whatever |
你也必须把
位于页面顶部,因此您可以访问母版页的扩展属性
我过去使用的一种解决方案是:
创建一个称为" SecurePage"的基本页面或类似的东西。
将属性" AllowedUserRoles"添加到基础页面,该属性是用户角色List或List的通用列表,其中int是角色ID。
在扩展SecurePage的任何页面的Page_Load事件中,将每个允许的用户角色添加到AllowedUserroles属性。
在基本页面中,重写OnLoad()并检查当前用户是否具有AllowedUserRoles中列出的角色之一。
这样就可以自定义每个页面,而无需在web.config中放入大量内容来控制每个页面。
几个解决方案浮出水面。
您可以在web.config文件中为每个页面设置限制。这样一来,您便可以拥有想要使用的任何文件夹层次结构。但是,无论何时添加其他页面,都需要使web.config文件保持最新。由文件夹结构确定可访问性的一个很好的部分是,在添加新页面时不必考虑它。
让您的页面继承自定义类(即EveryonePage,UserPage,AdminPage等),然后在Page_Load例程中进行角色检查。