我应该如何将 Windows 用户 ID 存储在数据库中?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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。

以上是关于我应该如何将 Windows 用户 ID 存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该只用护照序列化用户存储 user.id? [复制]

我应该/如何将我的 JWT 令牌存储在 redis 中以便我可以看到当前的用户会话?

如何在 Windows 中保存应用程序特定数据? [关闭]

如何将数组存储到mysql中?

我应该如何使用 sql server 中的存储过程将列名存储在变量中?

我应该如何将通过 Janrain 传入数组的数据存储在不同的变量中?