回答

收藏

将Windows SID存储在数据库中进行搜索

技术问答 技术问答 320 人阅读 | 0 人回复 | 2023-09-14

我有一个ASP.NET
0 g& V* ?, h; e, @, c& nMVC我需要允许客户根据应用程序的环境配置MembershipProvider,还能做到MembershipUser映射到我们数据库中的具体数据库User模型。
; m5 v; G7 U4 b1 K6 wMembership.GetUser()将使我能够访问登录用户Membership.ProviderUserKey。我可以用它来关联用户记录。我们的定制SQL只会返回提供程序User.Id,但AD不同。在这种情况下,ProviderUserKey是IdentityReference。
! F' o, D8 c/ \' B, i! J; {正如你所想,这些搜索将非常频繁地发生(尽管缓存可以帮助降低数据库级别)。
, y, i  N4 [/ B. }* R2 I我不能决定走哪条路线更好SID存储为varbinary或varchar列。列将不是主键,也不会有集群索引。我知道我可以很好地索引字符串,并以字符串的形式读取它们SID肯定比二进制好。有人愿意分享他们如何解决这种情况吗?# d+ u7 k* L+ S& c. }9 J- h6 z: h
更新不知道发帖前搜索的时候怎么会错过这个。SO但问题很明显,ActiveDirectoryMembershipProvider并且ActiveDirectoryMembershipUser像今天这样存在的任务还不够用。, T5 p8 L1 m: t7 k
该SO问题的答案链接到以下文章,指出:
8 Q6 v0 X3 x; Z$ E$ H7 j+ l0 e/ ]SID与域相比,相对标识符部分是唯一的,因此,如果域发生变化,相对标识符也会发生变化。; r" T8 ~2 P( d# K
因此,当用户对象从一个域移动到另一个域时,必须为用户帐户生成新的SID,并存储Object-SID属性中。
7 X8 h/ w0 V9 O7 p+ P; Z* K6 ~
然而,每个组和用户都有一个Object-GUID,即使账户被移动,对象也不会改变。因此,我应该在那里User类中使用Object-+ f; u( N- g$ j$ n' i+ n7 E
GUID,而不是Object-SID。否则,如果某人的用户记录被移动,则该记录将被放弃,从而破坏其主体与他们创建的数据之间的关系。. e0 [& y" K# _5 u% i) z
不幸的是,ActiveDirectoryMembershipUser别让我知道Object-
0 [* k. K! A+ j, N& BGUID。因此,在ActiveDirectoryMembershipUser完成工作后,我要么必须SID转换为GUID
- i8 i1 [0 k/ w6 H& P* ?9 ^,要么创建自己的SID,以便MembershipProvider当场完成我需要的一切。不幸的是,这意味着我可能不得不重复我以前为我完成的工作ActiveDirectoryMembershipProvider。
2 e$ N. a8 P8 _) e6 p7 L* w                                                               
) T5 t$ l3 F$ }! G2 O    解决方案:                                                               
: K, A8 z& b5 ~3 r- {7 L* b. \% w                                                                Microsoft将SID存储为varbinary(85)
: L' N4 X% l/ T' q% D! C, qsys.server_principals- m% e* M7 F, E2 c$ q/ u4 v
这也是唯一的列,所以它必须有索引…
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则