Asp.net 如何将.net成员身份角色分配给单个数据库记录

Asp.net 如何将.net成员身份角色分配给单个数据库记录,asp.net,asp.net-membership,Asp.net,Asp.net Membership,我正在开发一个系统,我们希望根据用户的角色限制显示给用户的信息的可用性 e、 g.我有一个名为EventType(ID,EventTypeDescription) 其中包含以下记录: 1, 'Basic Event' 2, 'Intermediate Event' 3, 'Admin Event' 我需要实现的是根据登录用户的用户名(以及角色)过滤返回的记录。e、 g如果高级用户登录,他们将看到所有事件类型,如果标准用户登录,他们将只看到基本事件类型等 理想情况下,我希望这样做的方式可以很容易

我正在开发一个系统,我们希望根据用户的角色限制显示给用户的信息的可用性

e、 g.我有一个名为
EventType(ID,EventTypeDescription)
其中包含以下记录:

1, 'Basic Event'
2, 'Intermediate Event'
3, 'Admin Event'
我需要实现的是根据登录用户的用户名(以及角色)过滤返回的记录。e、 g如果高级用户登录,他们将看到所有事件类型,如果标准用户登录,他们将只看到基本事件类型等

理想情况下,我希望这样做的方式可以很容易地扩展到其他表(如有必要)。因此,我希望避免简单地在每个表中添加一个“角色”字段,其中数据是用户上下文敏感的

我想到的一个想法是创建某种权限表,如:

PermissionsTable
(
  ID,
  Aspnet_RoleId,
  TableName,
  PrimaryKeyValue
)
这有一个缺点,使用它显然必须使用表名来切换要连接到的表

编辑: 在没有更好的建议的情况下,我将采用我提到的最后一个想法,但我将不使用TableName字段,而是将TableName标准化为它自己的表,如下所示:

TableNames
(
  ID,
  TableName
)

UserPermissionsTable
(
  ID,
  Aspnet_UserId,
  TableID,
  PrimaryKeyValue
)

您没有提到正在使用的数据库(如果有的话),但是假设使用SQL Server,那么如果您使用Windows身份验证进行连接,您可以创建视图或存储过程,根据函数过滤数据。

我们做了类似的事,我们的解决方案是使用表值函数进行连接。 即

从事件e中选择* 内部联接[dbo].fn\u可用事件(@User\u ID)a在e.ID=a.ID上


该函数只返回允许用户查看的事件的事件id。

即使您不使用它,但遗憾的是,您至少可以从中了解概念的细节。

我在构建CMS时做了类似的事情

基本上,我在db中创建了几个表: 使用者 角色 用户角色 物体 对象权限

好的,它是这样工作的

前三个是非常自我嘲讽的,用户,角色和他们之间的链接。 根据用户的角色成员资格授予用户权限

接下来我要做的就是定义我想要控制权限的“对象”以及我想要分配给它们的权限级别

所以对象包含一个对象定义列表,然后在其他表中扩展,这些表通过对象id进行关联,ObjectPermissions表基本上将对象链接到角色

在这一点上,也许有必要解释一下角色

在我看来,角色是一个权限列表,不多也不少

因此,如果我创建了一个名为guest的角色,并将该角色设置为允许读取权限,然后创建一个名为admin的角色,该角色具有全局权限,可以执行我可以执行的所有操作,然后执行类似的操作

添加用户1管理员角色。 将对象1添加到管理员角色

用户1现在将拥有对对象1的完全访问权限,这里重要的一点是,权限是继承的,因此任何子对象(想想文件和文件夹权限)也将处于相同的角色集中,除非递归重写

因此,默认情况下,我将根级别对象分配给每个关键系统角色。 然后,我在树的不同位置选择性地将用户添加到不同的角色

这有意义吗

本质上,我可以选择任何对象和任何用户,并通过将用户添加到与该对象相同的角色来授予该用户对该对象及其子对象的不同程度的权限

现在有一些事情需要注意

如果我想让用户对深度嵌套的对象拥有管理权限,但不在根级别,那么我必须创建一个新角色来授予所有权限,并将用户和对象添加到其中

原因是,如果我将用户添加到主管理员角色,那么用户将从根级别而不是从嵌套对象获得这些权限


不仅如此,但本质上这就是文件系统权限的工作方式。

您好,我确实在使用SQL Server,但不幸的是,我无法使用此解决方案,因为我正在使用表单身份验证。我不认为表单身份验证和模拟(使用连接字符串中的集成安全性)是互斥的。看看哪一个看起来对你有用。只是一个想法,但是如果你选择1个基本,2个中间,3个管理选项,那么你应该在这些数字之间留出一些空间,比如10 20 30,这样你就可以在将来在这些数字之间添加额外的代码。这将允许您按代码对表进行排序,并测试(admin)是否显示admin级别或更低。