【发布时间】:2010-12-10 08:37:22
【问题描述】:
我有一个 ASP.NET MVC 应用程序,我需要允许客户根据他们的环境配置 MembershipProviders,但仍然能够将该 MembershipUser 映射到我们数据库中的具体用户模型。
Membership.GetUser() 将允许我访问登录用户的Membership.ProviderUserKey。我可以使用它来关联用户记录。我们的自定义 SQL 提供程序将只返回 User.Id,但 AD 是另一回事。在这种情况下,ProviderUserKey 是 IdentityReference。
您可以想象,这些查找会非常频繁地发生(尽管缓存可以帮助减少数据库级别的查找)。
我无法决定哪条路线更好:将 SID 存储为 varbinary 或 varchar 列。该列不是主键,也没有聚集索引。知道我可以很好地索引字符串,并且以字符串格式读取 SID 肯定比二进制更好。有人愿意分享他们是如何解决这种情况的吗?
更新
我不知道我在发帖前搜索时错过了this SO question,但很明显ActiveDirectoryMembershipProvider 和ActiveDirectoryMembershipUser 并不完全适合手头的任务,因为它们今天存在.
在那个 SO 问题 linked the following article 中的答案,其中陈述了以下内容:
a 的相对标识符部分 SID 相对于域是唯一的, 因此,如果域发生变化,则相对 标识符也会改变。
因此当一个用户对象从一个移动 域到另一个,新的 SID 必须是 为用户帐户生成和 存储在 Object-SID 属性中。
但是,每个组和用户都有一个 Object-GUID,即使帐户被移动,它也永远不会改变。因此,我应该在我的 User 类中使用 Object-GUID,而不是 Object-SID。否则,如果某人的用户记录被移动,从而破坏了他们的主体与他们创建的数据之间的关系,他们的用户记录将被放弃。
不幸的是,ActiveDirectoryMembershipUser 不允许我使用 Object-GUID。因此,我要么必须在 ActiveDirectoryMembershipUser 完成工作后将 SID 转换为 GUID,要么创建我自己的 MembershipProvider 来完成我需要的一切。不幸的是,这意味着我可能不得不重复 ActiveDirectoryMembershipProvider 已经为我完成的工作。
【问题讨论】:
-
感谢更新信息 - 非常重要,值得了解。
标签: sql database-design asp.net-membership