我正在将Active Directory身份验证集成到我的应用程序中,并计划将我的应用程序内部帐户与用户的域SID关联起来。 对于我来说,使用SID的字符串格式比使用字节数组更容易处理,因此我计划将其以字符串形式存储在数据库中。 我应该将该字段设多长以确保SID不会被截断?
我正在将Active Directory身份验证集成到我的应用程序中,并计划将我的应用程序内部帐户与用户的域SID关联起来。 对于我来说,使用SID的字符串格式比使用字节数组更容易处理,因此我计划将其以字符串形式存储在数据库中。 我应该将该字段设多长以确保SID不会被截断?
所以我的问题的答案是:
varbinary(68)-- 纯二进制
varchar(136) -- (68*2) = 十六进制字符串
varchar(184) -- SID字符串我写了一个小程序进行测试,注意.NET 2.0具有SecurityIdentifier.MaxBinaryLength,我不知道这一点。
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
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)
UCHAR实际上是一个1字节的unsigned char。 ULONG是一个4字节的unsigned long。
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个字符的字符串。