我应该如何将 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\user
或 user@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
。"不必要。您可以指定SID
或GUID
。如果您的公司那么大,GUID
在多个域中将是唯一的,而 SID
不保证在域中是唯一的。但是SID
向后兼容 Windows NT。以上是关于我应该如何将 Windows 用户 ID 存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我应该只用护照序列化用户存储 user.id? [复制]
我应该/如何将我的 JWT 令牌存储在 redis 中以便我可以看到当前的用户会话?