代码之家  ›  专栏  ›  技术社区  ›  moribvndvs

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

  •  7
  • moribvndvs  · 技术社区  · 16 年前

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

    Membership.GetUser() Membership.ProviderUserKey ProviderUserKey 是一个 IdentityReference .

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

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


    我不知道我怎么错过了 this SO question ActiveDirectoryMembershipProvider ActiveDirectoryMembershipUser 它们不像今天这样适合手头的任务。

    linked the following article ,声明如下:

    因此,如果域发生变化,相对 标识符也会发生变化。

    因此,当用户对象从

    不幸的是, 不允许我获取对象GUID。因此,在以下情况下,我必须将SID转换为GUID MembershipProvider 这就满足了我当场所需的一切。不幸的是,这意味着我可能不得不重复已经为我做的工作 Active Directory成员资格提供程序 .

    3 回复  |  直到 8 年前
        1
  •  6
  •   gbn    16 年前

    Microsoft将SID存储为varbinary(85)格式 sys.server_principals

    这也是一个独特的列,因此它必须有一个索引。..

        2
  •  1
  •   Adrien    15 年前

    用户名是你最不想索引的东西。

    只有当您将用户从一个域更改为另一个域时,AD中的SID才会发生变化。RID分为2组-内置(<1000)和用户RID。预定义的用户(如管理员、访客等)始终具有相同的RID。

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

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

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

        3
  •  -3
  •   Tim Cooper    14 年前

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

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

    没有花哨的GUID或SID。…简单。