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

Rus*_*Cam 5 c# asp.net asp.net-membership sid active-directory

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

ActiveDirectoryMembershipProvider被使用时,ProviderUserKey该对象MembershipUser是如下

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

/* sidValue = "S-1-5-21-XXXX-XXXX-XXXX-YY"  */
Run Code Online (Sandbox Code Playgroud)

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

使用自定义MembershipProvider时,我可以使用objectSidDirectoryEntry对象的属性获取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"  */
Run Code Online (Sandbox Code Playgroud)

sidValue这种情况下是相同的,只是它不包含主体YY.

我的问题是双重的

  1. 是否需要本人才能唯一地识别个人?
  2. 是否可以从DirectoryEntry对象(或通过任何其他可用的类System.DirectoryServices)获取主体?

编辑:

做了一些进一步的阅读({1} {2})后,我现在知道如果用户从一个组/域移动到另一个组/域,sid可能会改变.鉴于此,将使用中GUID定义DirectoryEntry Properties["objectGUID"]的更好的选择来唯一识别用户?

ser*_*ist 3

objectGUID 是识别用户帐户的最佳选择。我强调这一点是因为 objectGUID 对于帐户实例来说是唯一且固定的。如果您删除并重新创建具有相同专有名称的帐户,您将获得不同的 objectGUID。因此,objectGUID 并不识别用户,而是识别帐户。

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

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

这是AD 属性信息的链接。这是DirectoryEntry Properties的链接。