我目前正在研究存储基于.NET的项目的用户角色和权限的方法 . 其中一些项目是基于网络的,有些则不是 . 我目前正在努力寻找最佳方法来实现我正在寻找的跨项目类型的一致,可移植的方式 .
在我所处的位置,我们希望利用Active Directory作为基本用户信息的单点联系人 . 因此,我们希望不必为每个应用程序的用户维护自定义数据库,因为它们已存储在Active Directory中并在那里进行了主动维护 . 此外,我们不希望编写自己的安全模型/代码,并且希望使用预先存在的内容,例如Microsoft提供的安全应用程序块 .
某些项目仅需要基本权限,例如读取,写入或无访问权限 . 其他项目需要更复杂的权限 . 这些应用程序的用户可能被授予某些区域的访问权限,但不能访问其他区域,并且他们的权限可能会在每个区应用程序的管理部分将控制和定义此访问权限,即AD工具 .
目前,我们正在使用集成的Windows身份验证在我们的Intranet上执行身份验证 . 这适用于查找基本用户信息,我已经看到ASP.NET可以扩展为提供Active Directory角色提供程序,因此我可以找到用户所属的任何安全组 . 但是,对我来说,这种方法的垮台似乎是所有东西都存储在Active Directory中,如果事情变得太大,可能会导致维护混乱 .
同样,我也听说过Active Directory轻量级目录服务,它似乎可以扩展我们的架构并只添加特定于应用程序的属性和组 . 问题是,我找不到任何关于如何做到这一点或如何工作的事情 . 有MSDN文章描述了如何与这个实例交谈以及如何创建一个新实例,但似乎没有什么能回答我的问题 .
My question is: 根据您的经验,我是否走上正轨?我只想使用Active Directory做什么,还是必须使用其他工具?
Other methods I've looked into:
-
使用多个web.config文件[stackoverflow]
-
创建自定义安全模型和数据库以跨应用程序管理用户
1 回答
使用AD进行身份验证是个好主意,因为无论如何都需要在那里添加所有人,而对于Intranet用户则不需要额外的登录 .
你是正确的,ASP.NET允许你使用一个允许你对AD进行身份验证的提供程序,虽然没有任何内容可以为你提供组成员资格支持(尽管如果你愿意,实现起来很简单,我可以提供一个样本) .
这里真正的问题是,如果您想使用AD组在每个应用程序中定义权限,是吗?
如果是这样,那么您可以选择创建自己的ASP.NET RoleProvider,也可以通过ApplicationServices由WinForms和WPF应用程序使用 . 此RoleProvider可以将AD中用户的ID链接到每个应用程序的组/角色,您可以将其存储在自己的自定义数据库中,这也允许每个应用程序允许管理这些角色,而无需这些管理员在AD中拥有额外的权限 .
如果需要,您还可以使用覆盖并将应用程序角色与AD组合在一起,因此,如果它们位于AD中的某个全局“管理”组中,则无论应用程序角色成员身份如何,它们都将获得应用程序的完全权限 . 相反,如果他们在AD中有一个团体或 property 说他们被解雇了你可以忽略所有App角色成员资格并限制所有访问(因为HR可能不会从每个应用程序中删除它们,假设他们甚至知道它们所有!) .
根据要求添加示例代码:
NOTE: based on this original work http://www.codeproject.com/Articles/28546/Active-Directory-Roles-Provider
对于ActiveDirectoryMembershipProvider,您只需要实现ValidateUser方法,虽然您可以根据需要实现更多,但新的AccountManagement命名空间使这一点变得微不足道:
对于您的角色提供者来说,这是一项更多的工作,我们在搜索谷歌时发现了一些关键问题,例如您要排除的群组,您要排除的用户等 .
它可能值得一篇完整的博客文章,但这应该可以帮助你入门,它会在Session变量中缓存查找,就像你可以提高性能的样本一样(因为完整的Cache样本会太长) .
此示例配置子节条目如下:
哇,那是很多代码!
PS:上面的角色提供者的核心部分是基于另一个人的工作,我没有方便的链接,但我们通过谷歌找到它,因此对该人的原始部分信用 . 我们对它进行了大量修改以使用LINQ并且无需数据库进行缓存 .