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

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

  •  4
  • moribvndvs  · 技术社区  · 15 年前

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

    Membership.GetUser() 将允许我访问登录用户的 Membership.ProviderUserKey . 我可以用它来关联用户记录。我们的自定义SQL提供程序将只返回user.id,但ad是另一回事。在那种情况下, ProviderUserKey 是一个 IdentityReference .

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

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


    更新

    我不知道我是怎么错过的 this SO question 当我在发帖前搜索的时候,但很明显 ActiveDirectoryMembershipProvider ActiveDirectoryMembershipUser 并不是像现在这样,完全适合手头的任务。

    这个问题的答案 linked the following article ,其中规定了以下内容:

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

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

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

    不幸的是, 活动目录成员身份用户 不允许我获取对象guid。所以,我要么在 活动目录成员身份用户 它是有效的,还是创建我自己的 MembershipProvider 这就是我在现场所需要的一切。不幸的是,这意味着我可能不得不在 活动DirectoryMembershipProvider .

    3 回复  |  直到 13 年前
        1
  •  6
  •   gbn    15 年前

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

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

        2
  •  1
  •   Adrien    14 年前

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

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

    如果您想处理用户等的移动,那么guid就是解决问题的方法。

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

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

    我会研究ADSI对象。这些是应该可以从ASP访问的COM对象。msdn解释得很好。adsearch对象可用于从guid返回用户属性(例如,包括dn)。

        3
  •  -3
  •   Tim Cooper    13 年前

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

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

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

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

    没有花哨的吉他和单刀键琴…简单。