如何根据用户角色限制asp.net控件操作?

时间:2010-03-12 14:22:26

标签: asp.net authentication controls authorization roles

我的应用程序中有几个页面或视图,对于经过身份验证的用户和匿名用户来说基本相同。我想将表单视图和网格视图中的插入/更新/删除操作仅限于经过身份验证的用户,并允许authed和anon用户进行读取访问。

我正在使用asp.net配置系统来处理身份验证和角色。该系统根据路径限制访问,因此我一直在创建authed和anon路径的重复页面。

立即想到的解决方案是检查相应事件处理程序中的角色,限制显示可能的操作(插入/更新/删除按钮)以及限制执行的操作(对于可能知道如何执行的用户没有按钮的动作。)但是,这个解决方案并不能消除重复 - 我会在一系列页面上复制安全代码而不是复制页面并根据路径限制访问;后者的复杂程度要低得多。

我总是可以构建一些提供基于角色的配置的控件,但我认为我现在没有时间做这种承诺。

是否有相对简单的方法(存在这样的控件?)或者我应该坚持基于路径的访问和重复页面?

使用两种授权方法是否有意义?还有一些页面严格用于任何一个角色,所以无论如何我都会使用基于路径的授权。

最后,使用基于路径的授权之外的其他东西会违反典型的asp.net设计实践,至少在使用asp.net配置系统的情况下是这样吗?

4 个答案:

答案 0 :(得分:3)

最好的方法是在自定义控件上添加一个属性,说明角色或允许此类角色的用户查看控件的内容。因为,你没有时间可以制作一个处理控件可见属性的辅助方法。像这样:

<asp:Button id="UpdateButton" runat="server" Visible="<%# IsInRole("Admin") %>" /> 

您还可以创建自己的帮助方法来检查更多条件。

答案 1 :(得分:2)

要显示控件,可以使用asp:LoginView。

http://www.codedigest.com/Articles/ASPNET/78_LoginView_Controls_with_Roles_in_ASPNet_20.aspx

表示“可能知道如何在没有按钮的情况下执行操作的用户”,

您可以在执行更新之前使用if User.IsInRole("Role_name") then ...。 您还可以使用以下方法为功能添加安全性:

<PrincipalPermission(SecurityAction.Demand, role:="Role_name")> _

http://www.4guysfromrolla.com/webtech/121901-1.2.shtml

答案 2 :(得分:1)

请看一下 Scott Mitchell 撰写的这两个精彩教程,我相信它会非常有用。

http://www.asp.net/security/tutorials/user-based-authorization-cs

http://www.asp.net/data-access/tutorials/limiting-data-modification-functionality-based-on-the-user-cs

进一步阅读你可以再看一下 Scott Mitchell

写的这些系列

http://www.4guysfromrolla.com/articles/120705-1.aspx

答案 3 :(得分:0)

一种解决方案是在数据库端编写一些自定义存储过程。如果你为auth'ed与unauth'ed传递了一个布尔标志,那么你的SQL代码可以处理返回哪些结果以及执行哪些操作。

但是,如果您设想许多用户未经授权,可能应该使用会话状态来检查用户的角色,然后再向数据库发出一千次调用。

基本上,您需要将网格“有条件地绑定”到其数据源,通过检查用户的角色来确定要调用的存储过程。

我希望这有点帮助!