【问题标题】:How should I store windows userid in database?我应该如何将 Windows 用户 ID 存储在数据库中?
【发布时间】:2012-06-20 07:20:24
【问题描述】:

目前我在 sql server 中将用户的 Windows 帐户存储为 nvarchar(10),这是存储用户 ID 的正确方法吗?数据类型应该是什么?或者我什至应该存储用户标识?

【问题讨论】:

    标签: sql-server sql-server-2008 sqldatatypes userid


    【解决方案1】:

    或者我什至应该存储用户 ID

    Stack overflow 中创建新帐户时。它接受Google/Facebook or Yahoo 用户ID,这意味着它使用Passport Authentication。但它仍然将用户信息保留在数据库中,用于查询/回复/cmets/flags等之间的关系。

    数据类型应该是什么?

    嗯,这取决于您的要求。如果是非英语语言。必须是NVarchar(50)

    【讨论】:

      【解决方案2】:

      Windows NT 用户身份称为SID,即security-identifier。它的字符串表示在SID String Format Syntax 中指定,而编组表示在SID--Packet Representation 中指定。如果要在数据库中存储 SID,请使用与 sys.databases.owner_sid 字段相同的表示形式:varbinary(85)。要检索登录 SID,请使用 SUSER_SID(也返回...varbinary(85))。

      不要将身份存储为登录名(domain\useruser@domain),因为这些更改方式比您预期的更频繁,特别是在大型公司中。我的在 10 年内改变了大约 5 次。

      【讨论】:

      • 据我从答案中了解到,如果我将使用用户 ID 将用户与某个进程连接,那么我应该使用 SID,但如果我将使用用户 ID 就像标签一样,那么使用纯用户 ID 是更好的选择,因为 SID 使我的数据库更难读取,对吗?
      • 向用户显示 SID 是没有用的,除了管理员。但是,您始终可以在 T-SQL 中使用 SUSER_SNAME(sid) 或在 C# 中使用 SecurityIdentifier.Translate(typeof(NTAccount)) 将 SID 转换为名称。
      【解决方案3】:

      这取决于userid 中的数据类型,如果它是来自您数据库中另一个表的 id,则根据父表中的数据类型保存它。如果它是 windows 用户 ID,则将其保存为 nvarchar,但确保容纳 logest 用户 ID。像 nvarchar(50)

      【讨论】:

        【解决方案4】:

        获取当前用户 id 时(检查HERE),使用char(30)

        因此,至少,您应该将长度更改为 30!

        【讨论】:

          【解决方案5】:

          这是一个非常复杂的问题。

          技术上不要存储名称。存储 ID,顺便说一下,无论如何它都是一个 GUID。

          这意味着当您重命名帐户时您是安全的,这就是 WINDOWS 所做的。有没有见过当您打开文件的权限时需要一秒钟才能显示名称?并先显示一个数字?这是因为 windows 从域控制器获取名称需要一点时间。

          SIMPLE 是存储帐户名称,但这意味着您在重命名时已经“死”了,这应该是相当的速度,otoh。我认为大多数解决方案都是这样做的;)

          【讨论】:

          • "无论如何,ID 都是GUID。"不必要。您可以指定SIDGUID。如果您的公司那么大,GUID 在多个域中将是唯一的,而 SID 不保证在域中是唯一的。但是SID 向后兼容 Windows NT。
          猜你喜欢
          • 1970-01-01
          • 2015-03-16
          • 1970-01-01
          • 2011-04-23
          • 2021-06-27
          • 1970-01-01
          • 2018-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多