同时使用多个ASP.NET角色提供程序

4
我正在开发一个ASP.NET系统,它有两个不同的角色层级。主层将使用Active Directory组来确定成员资格,而第二层将使用数据库。所有用户都将拥有一种层-1 AD角色,但并非所有用户都将拥有第二层数据库角色。
我知道可以使用AspNetWindowsTokenRoleProvider来管理AD角色,也知道可以使用SqlRoleProvider来管理数据库角色...我想同时使用这两个,这可能吗?

使用一个提供程序,让所有不应该拥有数据库角色的AD用户实际上都拥有一个权限很小的虚拟数据库角色,这样你就可以减少使用两个角色提供程序所带来的一些复杂性。 - tzup
如果我理解正确的话,你是在建议只使用SqlRoleProvider?但是并没有单一的AD角色 - 会有5个AD角色(而且我必须使用AD组来管理这些角色)。 - Cocowalla
2个回答

4
我建议从WindowsTokenRoleProvider派生,然后重写GetAllRolesGetRolesForUser等方法。
首先调用基类,然后附加来自您的数据库的适当角色列表。
顺便提一下,作为数据库键,我建议使用帐户SID(或其哈希值),而不是DOMAIN\username字符串,因为用户名可能会更改(例如婚姻等原因)并留下孤立的角色条目。这种情况比你想象的要经常发生 :-(

我刚开始走了一个类似的轨迹(但是扩展了SqlRoleProvider)。我会看看这是否可行。 - Cocowalla
那很好 :)下一个问题是WindowsTokenRoleProvider在用户属于许多AD组时的性能差,但这是一个无关的问题... - Cocowalla

2
提供者是“可插拔”的,理论上您可以放置任何需要的提供者并使其正常工作。它们还有文档,以便您可以扩展现有的提供者或使用自己的提供者。
因此,基本上您需要自己的提供者来允许您合并这两个提供者-为此,您可以继承其中一个提供者,然后在重写的方法中合并结果,也可以创建实际上是代理类的东西(可能有模式的正确名称),该类具有AD和SQL提供者的实例,并通过并合并结果来传递调用。
然而,根本上答案是编写您自己的提供者,将这两个默认提供者组合以满足您的特定要求。

个人而言,我更喜欢“代理类”,这可以是“装饰器”模式。 - Lex Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接