3

我正在努力实现以下目标:

  1. 针对 Active Directory 对用户进行身份验证。
  2. 如果用户属于“A”组,我想限制用户权限
  3. 如果用户属于“B”组,我想在我的代码中添加一些其他逻辑。

我能够实现上述列表中的第一个。

我在我的 Web 应用程序(Intranet)中使用表单身份验证。我做了一些研究,并且有各种建议使用我完全不知道的 Microsoft Active Directory 应用程序模式(ADAM)。有没有一种方法可以在不使用的情况下实现上述目标亚当?假设将组列表放入代码中,基于此,如果用户属于某个组,我可以拨打电话,依此类推..

是我只在团体层面上思考,这限制了我的选择吗?或者除了从组级别授予用户访问权限之外还有其他方法吗?或者我完全不理解 Active Directory 身份验证的概念?

4

2 回答 2

3

检查这个问题,虽然描述不同,但它是同一个问题:Validate a username and password against Active Directory?

无论哪种方式,C# 都完全支持 ActiveDirectory,不需要额外的系统(我也不知道 ADAM 是什么)。

要检查用户名的组,请使用以下代码:

UserPrincipal p = UserPrincipal.FindByIdentity(
domainContext, IdentityType.SamAccountName, userName);
var groups = p.GetGroups();
foreach (GroupPrincipal g in groups) { /* do something */ }
于 2011-11-08T14:15:00.760 回答
2

如果您询问一般架构或最佳实践问题,我建议您查看基于声明的身份验证。特别是Active Directory 联合身份验证服务(ADFS)。

基本上,您似乎需要比仅基于组更精细地控制用户可以执行的操作。组成员有时可能非常广泛。例如,并非“用户”中的每个人都可能具有相同的权限,“销售”中的每个人都不会具有相同的访问权限。但是,您不想创建诸如“销售 - 经理”、“销售 - 员工”、“销售 - 高管”等组。这很快就会变得笨拙。而且,无论您花多少时间来设计完美的组分配,几年后一切都会改变,因为某些销售经理将被允许做一些其他销售经理不能做的事情。

为了解决这个问题,使用了基于声明的身份验证。无需在组成员级别指定权限,您只需在代码中检查用户是否具有特定的“声明”。您可以发疯并创建对您的应用程序有意义的尽可能多的声明。您可以提出“可以更改出生日期”、“可以授权支付超过 1000 美元”等声明。

声明仅附加到您的用户身份,可通过线程的当前原则获得。

现在,如何为用户分配您询问的这些“声明”?好吧,如果您使用的是 ADFS,无论如何都可以。您显然可以根据 AD 组成员身份进行操作。您可以根据数据库查找来执行此操作。如果您愿意,您可以在一天中的某个时间或一年中的某个月份执行此操作。

关键是,现在您的索赔签发和索赔执行是完全独立的,可以独立更改而不会相互影响。你的代码只是说“嘿,这个人有一个索赔,让他支付超过 1000 美元,所以我会让他这样做。为什么他有这个索赔,我不知道也不关心”。然后,您的 ADFS 可以根据它认为合适的任何标准发出声明。例如“如果用户是 Managers 组的成员,或者在安全数据库的 SuperUsers 表中有一个条目,或者被命名为 'Tim Timsky',则允许他花费超过 1000 美元”

因此,要回答您关于“仅在限制我的选择的群体层面上思考”的问题,当然不必这样做。如果您正在开始一个新的绿地项目,ADFS 等新工具会更轻松地为您提供很多选择。

但当然它有一个警告,那就是所有抽象都以增加复杂性为代价。这是您要引入系统的另一部分。您可以解耦您的应用程序并引入更高层的抽象和功能。但是该层是否值得引入取决于您计划如何使用该应用程序。如果您认为应用程序永远不必区分“管理器”和“用户”,那么基于声明的身份验证就太过分了。但是,如果您觉得随着时间的推移,您的应用程序中将有不同的点点滴滴的功能需要根据模糊且不断变化的规则分配给不同的用户,那么基于声明的身份验证将使您的解决方案更加整洁。

与往常一样,将两个部分解耦的净优势取决于一个独立于另一个而变化的频率。

于 2011-11-08T14:55:46.157 回答