如何在ASP.NET Web应用程序上使用表单身份验证最佳地处理基于角色的权限?
时间:2020-03-05 18:44:39 来源:igfitidea点击:
我正在使用ASP.NET登录控件和表单身份验证作为ASP.NET Web应用程序的成员身份/凭证。
我有两个角色:
- 用户数
- 管理员
我希望页面可以被四个不同的组查看:
- 所有人(默认,帮助)
- 匿名(CreateUser,登录名,PasswordRecovery)
- 用户(ChangePassword,DataEntry)
- 管理员(报告)
在"我如何学习视频系列:成员资格和角色"中的示例上进行扩展,我将这些页面文件放入以下文件夹中:
我使用ASP.NET网站管理工具为每个文件夹设置访问规则。
它可以工作,但对我来说却很笨拙,当Login.aspx不在根目录中并且使用Login.aspx的ReturnUrl参数时,它会产生问题。
有一个更好的方法吗?我可以在页面级别而不是在文件夹级别设置权限吗?
解决方案
回答
几个解决方案浮出水面。
- 我们可以在web.config文件中为每个页面设置限制。这样一来,我们便可以拥有想要使用的任何文件夹层次结构。但是,无论何时添加其他页面,都需要使web.config文件保持最新。由文件夹结构确定可访问性的一个很好的部分是,在添加新页面时不必考虑它。
- 让页面继承自定义类(即EveryonePage,UserPage,AdminPage等),然后在Page_Load例程中进行角色检查。
回答
我过去使用的一种解决方案是:
- 创建一个称为" SecurePage"的基本页面或者类似的东西。
- 将属性" AllowedUserRoles"添加到基础页面,该属性是用户角色List或者List的通用列表,其中int是角色ID。
- 在扩展SecurePage的任何页面的Page_Load事件中,将每个允许的用户角色添加到AllowedUserroles属性。
- 在基本页面中,重写OnLoad()并检查当前用户是否具有AllowedUserRoles中列出的角色之一。
这样就可以自定义每个页面,而无需在web.config中放入大量内容来控制每个页面。
回答
在母版页中,我定义了一个公共属性,用于切换安全检查,默认为true。我还声明了一个字符串;该页面所需的角色的定界列表。
在我的母版页的页面加载中,我执行以下操作
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
你也必须把
位于页面顶部,因此我们可以访问母版页的扩展属性