我正在将 Active Directory 身份验证构建到我的应用程序中,并计划将我的应用程序的内部帐户链接到用户的域 SID。 对我来说,使用 sid 的字符串格式比使用字节数组更容易,因此我计划将其作为字符串存储在数据库中。 我应该将该字段设置多长时间才能确保 SID 不会被截断?
我也有同样的问题,我相信正确的答案是:
我自己没有检查过数学,但这里使用的技术看起来是有效的: https://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J
参考Russell Mangel于2006年8月19日写的程序,也复制在这里供参考:
所以我的问题的答案是:
varbinary(68)——纯二进制
varchar(136) -- (68*2) = 十六进制字符串
varchar(184) -- SID 字符串我写了一个小程序来测试, 请注意 .NET 2.0 有 安全标识符.MaxBinaryLength,I 不知道这个。
Console.WriteLine("SID Min. num Bytes: {0}", SecurityIdentifier.MinBinaryLength); Console.WriteLine("SID Max. num Bytes: {0}", SecurityIdentifier.MaxBinaryLength); Byte[] bytes = new byte[SecurityIdentifier.MaxBinaryLength]; for (Int32 i = 0; i < bytes.Length; i++) { bytes[i] = 0xFF; } bytes[0] = 0x01; // Must be 1 bytes[1] = 0x0F; // Max 15 (base10) SecurityIdentifier sid = new SecurityIdentifier(bytes, 0); String sidString = sid.ToString(); Console.WriteLine("Max length of SID in String format: {0} ", sidString.Length); Console.WriteLine(sidString);
结果
SID Min. num Bytes: 8 SID Max. num Bytes: 68 Max length of SID in String format: 184 S-1-281474976710655-4294967295-4294967295-4294967295-4294967295-4294967295- 4294967295-4294967295-4294967295-4294967295-4294967295-4294967295- 4294967295-4294967295-4294967295-4294967295
根据ntseapi_x.h:
typedef struct _SID_IDENTIFIER_AUTHORITY {
UCHAR Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
typedef struct _SID {
UCHAR Revision;
UCHAR SubAuthorityCount;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
ULONG SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;
#define SID_MAX_SUB_AUTHORITIES (15)
A UCHAR 实际上是一个 unsigned char,它是 1 个字节。 ULONG 是一个 unsigned long,为 4 个字节。
SID 的最大数据大小为 68 字节:UCHAR + UCHAR + (UCHAR * 6) + (ULONG * 15) = 1 + 1 + 6 + 60 = 68
将 SID 转换为字符串,就像通过调用 ConvertSidToStringSid 获得的结果一样,可能如下所示:L"S-1-5-21-66"
SID 的最大字符串长度为 184:3 + 1 + 14 + 1 + (10 * 15) + 14 = 183,或 184 计算空值。
您可以考虑仅使用 MAX_UNICODE_STACK_BUFFER_LENGTH 或 256,它非常适合内存。
虽然 184 看起来是正确的,但在官方文档上有一个不同的值:
SID - 指定域帐户的安全标识符。 SID 是一个最大长度为 256 个字符的字符串。
在winnt.h中,有一个带有注释的宏,基本上说答案是187个字符
// 2 (S-)
// 4 (Rev(max: 255)-)
// 15 (
// If (Auth < 2^32): Auth(max:4294967295)-
// Else: 0xAuth(max:FFFFFFFFFFFF)-
// )
// (11 * SID_MAX_SUB_AUTHORITIES) (SubN(max:4294967295)-)
// 1 (NULL character)
// = 187 (assuming SID_MAX_SUB_AUTHORITIES = 15)
#define SECURITY_MAX_SID_STRING_CHARACTERS \
(2 + 4 + 15 + (11 * SID_MAX_SUB_AUTHORITIES) + 1)