authentication - que - seo title
¿Cuál es la longitud máxima de un SID en formato SDDL? (2)
Estoy creando la autenticación de Active Directory en mi aplicación y planeo vincular las cuentas internas de mi aplicación con el SID del dominio de un usuario. Es más fácil para mí trabajar con el formato de cadena del sid que con una matriz de bytes, por lo que planeaba almacenarlo en la base de datos como una cadena. ¿Cuánto tiempo debo hacer el campo para asegurar que los SID no sean truncados?
- Para el formato de cadena, la respuesta común de 184 no es correcta. Si la autoridad está entre 32 y el máximo de 48 bits, entonces se debe representar como una cadena hexadecimal, no decimal, y se debe añadir con ''0x''. Esto significa que en lugar de una cadena de 15 caracteres necesaria para representar los 48 bits máximos en decimal, realmente necesita una cadena de 14 caracteres (48 bits / 4 bits + 2), lo que significa que (184 - 15 + 14) se requieren 183 caracteres para la totalidad. SID cadena. Para menos de 32 bits, se utiliza el formato decimal (máximo 10 caracteres decimales).
Tuve la misma pregunta, y creo que la respuesta correcta es:
- ID como cadena: 184 caracteres, o varchar (184) en SQL Server
- SID como cadena de dígitos hexadecimales: 136 caracteres, o varchar (136) en SQL Server
- SID como binario: 68 bytes, o varbinary (68) en SQL Server
No he comprobado las matemáticas, pero la técnica utilizada aquí parece válida: https://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J
Consulte el programa escrito por Russell Mangel el 19 de agosto de 2006, también copiado aquí como referencia:
Así que la respuesta a mi pregunta es:
varbinary (68) - binario puro
varchar (136) - (68 * 2) = hexString
varchar (184) - SID StringEscribí un pequeño programa para probar, note que .NET 2.0 tiene SecurityIdentifier.MaxBinaryLength, no sabía esto.
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);
Resultados
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