5

我在自定义 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"  */

据我了解,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"  */

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

我的问题有两个

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

编辑:

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

4

1 回答 1

3

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

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

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

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

于 2009-08-12T17:23:44.577 回答