ASP.NET - 获取DirectoryEntry / SID的主体/相对标识符(RID)

时间:2009-08-12 10:06:29

标签: c# asp.net active-directory asp.net-membership sid

我在自定义MembershipProvider类中使用Active Directory来验证ASP.NET 2.0 Intranet应用程序中的用户,并将他们的sid与应用程序的配置文件相关联。

使用ActiveDirectoryMembershipProvider时,ProviderUserKey的{​​{1}}对象如下

MembershipUser

据我了解,SecurityIdentifier sid = (SecurityIdentifier)Membership.GetUser().ProviderUserKey; string sidValue = sid.ToString(); /* sidValue = "S-1-5-21-XXXX-XXXX-XXXX-YY" */ 是命名空间中的主体(也称为组/域)。

使用自定义MembershipProvider时,我可以使用DirectoryEntry对象的YY属性获取sid

objectSid

在这种情况下DirectoryEntry entry = new DirectoryEntry(path, username, password); SecurityIdentifier sid = new SecurityIdentifier((byte[])entry.Properties["objectSid"].Value, 0); string sidValue = sid.ToString(); /* sidValue = "S-1-5-21-XXXX-XXXX-XXXX" */ 是相同的,除了它不包含主体sidValue

我的问题是双重的

  1. 是否需要本人才能唯一识别个人?
  2. 是否可以从DirectoryEntry对象(或通过YY中提供的任何其他类)获取主体?
  3. 修改

    进行了进一步的阅读({1} {2})后,我现在知道如果用户从一个组/域移动到另一个组/域,则sid可能会发生变化。鉴于此,使用System.DirectoryServices GUID中定义的DirectoryEntry是否是唯一标识用户的更好选择?

1 个答案:

答案 0 :(得分:3)

objectGUID是识别用户帐户的最佳选择。我强调这一点,因为objectGUID是唯一的,并且对于帐户实例是固定的。如果删除并重新创建具有相同distinguishedName的帐户,则会获得不同的objectGUID。因此,objectGUID不识别用户,它识别帐户。

因此,如果您想识别帐户,请使用objectGUID。

有时,管理员可以删除并重新创建帐户以解决问题。如果您需要在发生这种情况后识别用户,则需要在帐户对象上选择其他内容。这可能需要依赖于您的帐户定义政策。也许你有sAMAccountNames不是基于用户的名字?也许管理员填充employeeid或employeeNumber?也许他们强制执行displayNames的唯一性?

这是AD attribute info的链接。 这是DirectoryEntry Properties的链接。