3

问题:

在 C# 中,有没有办法在不使用DirectoryServices.AccountManagement库或 icky-ugly LDAP的情况下查找 Active Directory 组 SID ?

[更新] - 为什么我要问:

[Authorize]属性和底层WindowsPrincipal.IsInRole(string role)仅针对samAccountNameAD 中的检查。

这不仅是微软建议在检查角色时避免的遗留标识符:

// It is also better from a performance standpoint than the overload that accepts a string. 
// The aformentioned overloads remain in this class since we do not want to introduce a 
// breaking change. However, this method should be used in all new applications and we should document this.
public virtual bool IsInRole (SecurityIdentifier sid) {}

但我也无法控制 AD,并且无法确保 samAccountName 与我们要求设置的“用户友好”名称保持同步。这就是问题首先出现的原因,传递复数(名称)而不是单数(samAccountName)字符串......值不一样。

此外,samAccountName 和 SID 可能会更改 - 例如,如果 AD 管理员删除帐户并重新创建它,SID 肯定会不同,samAccountName 是另一个人为错误的地方,但他们总是会恢复名称/UPN 值根据要求。

最终,我想编写一个我自己的干净的授权属性来检查组成员身份,而不必对 SAM 或 SID 进行硬编码。

我知道我可以使用 DirectoryServices.AccountManagement 做到这一点:

// get group principal 
var pc = new PrincipalContext(ContextType.Domain, "domainName");
var gp = GroupPrincipal.FindByIdentity(pc, IdentityType.Name, "groupName");
// check if user is in group.
var up = UserPrincipal.Current;
var usersGroups = up.GetGroups();
var inGroup = usersGroups.Contains(gp);

我只是想知道是否有一种更简单、依赖性更小、非传统的方法来做到这一点,以保持要编程的属性尽可能精简。

我之前的相关问题: Active Directory Group Membership Checking in .Net 4.5

4

1 回答 1

7

你可以很容易地做到这一点 - 设置域上下文,找到组,获取Sid属性 - 像这样:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find your group - by group name, group DN, SAM Account Name - whatever you like! 
// This is **NOT** limited to just SAM AccountName!
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, groupSamAccountName);

if(group != null)
{
    // this gives you the variable of type "SecurityIdentifier" to be used in your 
    // call to "IsInRole" ....
    SecurityIdentifier groupSid = group.Sid;
    string groupSidSDDL = groupSid.Value;
}

另外:我不明白您对使用的反感samAccountName- 这是每个组的强制性和独特的属性 - 所以它是唯一标识您的组的完美匹配!

您应该检查System.DirectoryServices.AccountManagement(S.DS.AM) 命名空间。在这里阅读所有相关信息:

新的 S.DS.AM 使得在 AD 中与用户和组一起玩变得非常容易!

于 2012-10-31T21:17:39.630 回答