ASP.NET – 获取DirectoryEntry / SID的主体/相对标识符(RID)
我在自定义MembershipProvider类中使用Active Directory来validationASP.NET 2.0 Intranet应用程序中的用户,并将其sid与应用程序的配置文件相关联。
使用ActiveDirectoryMembershipProvider
, MembershipUser
的ProviderUserKey
对象如下所示
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可能会改变。 鉴于此,使用DirectoryEntry
Properties["objectGUID"]
定义的GUID
是否是唯一识别用户的更好选择?
objectGUID是识别用户帐户的最佳选择。 我强调这一点,因为objectGUID是唯一的,并且对于帐户实例是固定的。 如果删除并重新创建具有相同distinguishedName的帐户,则会获得不同的objectGUID。 因此,objectGUID不识别用户,它识别帐户。
因此,如果要识别帐户,请使用objectGUID。
有时,管理员可以删除并重新创建帐户以解决问题。 如果您需要在发生这种情况后识别用户,则需要在帐户对象上选择其他内容。 这可能需要依赖于您的帐户定义政策。 也许你有sAMAccountNames不是基于用户的名字? 也许管理员填充employeeid或employeeNumber? 也许他们强制displayNames的唯一性?
这是AD属性信息的链接。 这是DirectoryEntry属性的链接。
- 针对活动目录中的用户进行身份validation?
- 使用c#删除活动目录中的用户
- WCF服务中的System.DirectoryServices.AccountManagement.PrincipalContext和Impersonation
- GroupPrincipal.GetMembers在组(或子组,如果递归)包含ForeignSecurityPrincipal时失败
- ASP.NET / Active Directory – 支持域用户的自动登录
- 如何使用System.DirectoryServices.ActiveDirectory.Domain类获取域别名
- Active Directory嵌套组
- 检测使用ASP.NET应用程序登录计算机的用户
- 使用C#检查Active Directory中是否存在UserID