我正在将Active Directory身份验证构建到我的应用程序中,并且我计划将应用程序的内部帐户链接到用户的域SID。我更容易使用sid的字符串格式而不是字节数组,所以我打算将它作为字符串存储在数据库中。我应该多长时间来确保SID不会被截断?
答案 0 :(得分:31)
我有同样的问题,我相信正确的答案是:
我自己没有检查过数学,但这里使用的技术看起来有效: https://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J
参考Russell Mangel于2006年8月19日撰写的程序,也在此处复制以供参考:
所以我的问题的答案是:
varbinary(68) - 纯二进制
varchar(136) - (68 * 2)= hexString
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
答案 1 :(得分:0)
答案 2 :(得分:0)
根据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)
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,非常适合内存。