Sql 在数据库中存储Windows SID以进行查找

Sql 在数据库中存储Windows SID以进行查找,sql,database-design,asp.net-membership,Sql,Database Design,Asp.net Membership,我有一个ASP.NET MVC应用程序,我需要允许客户根据他们的环境配置MembershipProviders,但仍然能够将MembershipUser映射到数据库中的具体用户模型 Membership.GetUser()将允许我访问登录用户的成员身份。ProviderUserKey。我可以使用它来关联用户记录。我们的自定义SQL提供程序将只返回User.Id,但AD是另一回事。在这种情况下,ProviderUserKey是一个IdentityReference 正如您所想象的,这些查找将非常频

我有一个ASP.NET MVC应用程序,我需要允许客户根据他们的环境配置MembershipProviders,但仍然能够将MembershipUser映射到数据库中的具体用户模型

Membership.GetUser()
将允许我访问登录用户的
成员身份。ProviderUserKey
。我可以使用它来关联用户记录。我们的自定义SQL提供程序将只返回User.Id,但AD是另一回事。在这种情况下,
ProviderUserKey
是一个
IdentityReference

正如您所想象的,这些查找将非常频繁(尽管缓存可以帮助减少数据库级别的查找)

我无法决定哪条路径更好:将SID存储为varbinary或varchar列。此列不是主键,也没有聚集索引。知道我可以很好地索引字符串,并且以字符串格式读取SID肯定比二进制更好。有人愿意分享他们是如何解决这种情况的吗


更新 我不知道我在发布前搜索时怎么会错过,但很明显,
ActiveDirectoryMembershipProvider
ActiveDirectoryMembershipUser
并不像今天这样适合手头的任务

该问题的答案如下:

数据的相对标识符部分 SID相对于域是唯一的, 因此,如果域发生变化,相对 标识符也会改变

因此,当用户对象从一个 域到另一个域时,必须创建新的SID 为用户帐户和 存储在对象SID属性中

但是,每个组和用户都有一个对象GUID,即使帐户被移动,该GUID也不会更改。因此,我应该在我的用户类中使用对象GUID,而不是对象SID。否则,如果某人的用户记录被移动,那么他们的用户记录将被放弃,从而破坏其主体与他们创建的数据之间的关系


不幸的是,
ActiveDirectoryMembershipUser
不允许我获取对象GUID。因此,我要么在
ActiveDirectoryMembershipUser
完成其工作后将SID转换为GUID,要么创建自己的
MembershipProvider
,即时完成所有需要的操作。不幸的是,这意味着我可能不得不重复由
ActiveDirectoryMembershipProvider

为我所做的工作,Microsoft将SID存储为varbinary(85)


这也是一个独特的列,所以它必须有一个索引…

听起来你让这比需要的困难得多。您需要SID或GUID做什么?对于ActiveDirectory中维护的用户帐户,您已经有了一个唯一的、完全可读的标识符

它被称为“用户名”。希望它与存储在应用程序“用户”表中的用户名相同

你的应用程序只需要知道该用户名是否已成功通过ActiveDirectory身份验证。因此,如果他们成功登录,您只需将他们经过身份验证的事实存储在会话变量中

如果将它们配置为使用db用户登录,如果成功,则设置相同的会话变量,指示它们已成功登录


没有华丽的guid或sid。。。简单。

用户名是您最不希望索引的内容

只有当您将用户从一个域更改为另一个域时,广告中的SID才会更改。RID分为两组-内置(<1000)和用户RID。预定义用户(如管理员、来宾等)始终具有相同的RID

如果您想处理用户的移动等,那么GUID就是一种方法

用户名可以在用户和组管理中随时更改

这与对象名不同,对象名是不变的,但我不认为它在整个林中是唯一的。您可以有任意数量的John Smith用户


我会调查ADSI对象。这些是COM对象,应该可以从ASP访问。MSDN解释得很好。ADSearch对象可用于从GUID返回用户属性(例如,包括DN)。

这是对我的原始帖子的一个很好的回答,因此我将给你评分。不幸的是,在进一步研究之后,看起来我根本不想要SID(请参阅更新)。谢谢。用户名可以而且确实会改变(想想一个用户结婚后的姓氏会改变)。是的,他们会改变,并且取决于他们在Active Directory中如何处理,您的SID和/或GUID也会改变。不要仅仅因为涉及到一些维护就避免使用简单的解决方案,因为总会有一些维护。您的解决方案越简单-维护越简单。因此,我的更新。对象SID可以更改,因此我不会使用它。对象GUID不会更改,除非管理员更改它或重新创建帐户。对于这种特殊情况,我可以将它交给维护任务,因为它比重命名的帐户要难得多。但是,如果我使用这个名称,它会改变,他们登录系统将创建一个新的用户记录,现在我有了重复/孤立的数据。如果我们能够事先避免这种情况,我们就不能每次都修复或清理数据。相信我,我不是故意回避simple。@RonSavage GUID永远不应该更改,SID只在帐户在域之间移动时更改。用户名不仅会改变,新员工有时也会得到以前员工的用户名。如果他们因此继承了旧的员工历史记录,那将是一个真正的问题。GUID永远不会更改,因此它是最佳选择。您还应该将用户名保存在单独的位置(列或表)。因为当用户帐户在ActiveDirectory中被删除时,您将无法再识别该用户。它也更方便,更快,能够获得一个人类可读的描述,直接与您的s