我在自定义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时,我可以使用DirectoryEntry对象的
objectSid
属性获取sidDirectoryEntry 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
。我的问题有两个方面
System.DirectoryServices
中提供的任何其他类)获取主体? 编辑:
经过进一步阅读({1} {2}),我现在知道,如果用户从一个组/域移到另一个组/域,则sid可以更改。有鉴于此,使用
GUID
DirectoryEntry
中定义的Properties["objectGUID"]
是唯一标识用户的更好选择吗? 最佳答案
objectGUID是识别用户帐户的最佳选择。我之所以强调这一点,是因为objectGUID是唯一的,并且对于帐户的实例是固定的。如果删除并重新创建具有相同distinguishedName的帐户,则将获得不同的objectGUID。因此,objectGUID无法识别用户,而是识别帐户。
因此,如果要标识帐户,请使用objectGUID。
有时,管理员可以删除帐户并重新创建帐户以解决问题。如果即使在发生这种情况后仍需要标识用户,则需要在帐户对象上选择其他内容。那可能必须取决于您的帐户定义策略。也许您有不基于用户名的sAMAccountName?也许管理员会填充employeeid或employeeNumber?也许他们为displayNames强制唯一性?
这是AD attribute info的链接。
这是DirectoryEntry Properties的链接。