基于角色为网站实现不同视图的最佳方法是什么?

时间:2008-10-16 20:04:40

标签: asp.net security roles

在ASP.NET中,执行以下操作的最佳方法是什么:

  1. 根据您的权利显示某些控件?
  2. 对于gridview控件,如何根据您的角色显示某些列?
  3. 我想的是数字2,数据来自数据库中的角色特定视图。

2 个答案:

答案 0 :(得分:5)

我没有实际使用角色来隐藏/显示某些控件,而是建议为每个角色设置另一层权限,而不是基于这些权限进行显示/隐藏。

通过这种方式,您可以重新定义角色拥有的权限,而不必更改代码。

此外,这允许您在将来创建新角色,并为角色分配一组权限。

至于控件,是的......我只是根据user.IsInRole(“permissionname”)值在控件上设置Visible属性。

对于网格我也会这样做...将列的可见性设置为IsInRole布尔值。

//Delete Icon Column
gridViewContacts.Columns[0].Visible = user.IsInRole("DeleteAnyContact"); 

我会以非常精细的方式创建您的权限..例如

  • ViewAnyContact
  • ViewOwnContact
  • EditOwnContact
  • EditAnyContact
  • AddAnyContact
  • DeleteOwnContact
  • DeleteAnyContact
  • 等等...

答案 1 :(得分:1)

如果您要使用基于角色的路由,ASP.NET(自2.0版本以来)已经提供了各种可用的成员控制,这可能对此方案有所帮助。假设(并且这可能是错误的假设)您正在使用内置成员资格提供程序,您实际上可以使用LoginView控件来处理#1。

它的工作方式是LoginView可以使用RoleGroups及其关联的ContentTemplates根据角色自定义用户的视图。这与内置会员提供商无缝协作;我相信如果你基于微软的技术建立自己的会员提供商,它也会起作用。 (我没有完成后一步。)

可以想象,你可以将它用于#2,但它最终会带来重复的代码和努力,这不是我个人的偏好。我认为您选择使用特定于角色的SQL视图来驱动该表可能比此选项更好。 (当然,还有其他选择,可能会更好。)

我将推荐Elijah Manor建议使用权限而不是角色。一般来说,这也是我的偏好。 (我很惊讶地发现会员提供商的技术没有达到那个水平。)但是,在任何以权限为中心的情况下,你基本上都必须自己动手。 (我已经完成了这项工作,虽然它非常灵活,但是保护任何给定页面的代码都会变得毛茸茸。)

编辑:我道歉;我打算包含一个LoginView控件的链接。 DotNetJunkies上有tutorial