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

使用ActiveDirectoryMembershipProvider时,ProviderUserKeyMembershipUser对象如下

SecurityIdentifier sid = (SecurityIdentifier)Membership.GetUser().ProviderUserKey;
string sidValue = sid.ToString();

/* sidValue = "S-1-5-21-XXXX-XXXX-XXXX-YY"  */

据我了解,YY是命名空间(也称为组/域)中的主体。

使用自定义MembershipProvider时,我可以使用DirectoryEntry对象的objectSid属性获取sid
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相同,不同之处在于它不包含主体YY

我的问题有两个方面
  • 为了唯一地识别个人,是否需要主体?
  • 是否可以从DirectoryEntry对象(或通过System.DirectoryServices中提供的任何其他类)获取主体?

  • 编辑:

    经过进一步阅读({1} {2}),我现在知道,如果用户从一个组/域移到另一个组/域,则sid可以更改。有鉴于此,使用GUID DirectoryEntry中定义的Properties["objectGUID"]是唯一标识用户的更好选择吗?

    最佳答案

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

    因此,如果要标识帐户,请使用objectGUID。

    有时,管理员可以删除帐户并重新创建帐户以解决问题。如果即使在发生这种情况后仍需要标识用户,则需要在帐户对象上选择其他内容。那可能必须取决于您的帐户定义策略。也许您有不基于用户名的sAMAccountName?也许管理员会填充employeeid或employeeNumber?也许他们为displayNames强制唯一性?

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

    09-26 20:05