2009-08-12 10 views
5

Estoy utilizando Active Directory en una clase MembershipProvider personalizada para autenticar usuarios en una aplicación de intranet ASP.NET 2.0 y asociar su sid con un perfil para la aplicación.ASP.NET - Obtener el identificador principal/relativo (RID) para un DirectoryEntry/SID

Cuando se utiliza el ActiveDirectoryMembershipProvider, el objeto ProviderUserKey para la MembershipUser es como sigue

SecurityIdentifier sid = (SecurityIdentifier)Membership.GetUser().ProviderUserKey; 
string sidValue = sid.ToString(); 

/* sidValue = "S-1-5-21-XXXX-XXXX-XXXX-YY" */ 

Como lo entiendo, YY es el principal dentro del espacio de nombres (también referido como un grupo/dominio).

Cuando se utiliza el MembershipProvider costumbre, puede conseguir el SID utilizando la propiedad objectSid de un objeto DirectoryEntry

DirectoryEntry entry = new DirectoryEntry(path, username, password); 
SecurityIdentifier sid = new SecurityIdentifier((byte[])entry.Properties["objectSid"].Value, 0); 
string sidValue = sid.ToString(); 

/* sidValue = "S-1-5-21-XXXX-XXXX-XXXX" */ 

El sidValue en este caso es idéntico, excepto que no contiene el director YY.

Mi pregunta es doble

  1. es el principal necesaria con el fin de identificar de forma exclusiva un individuo?
  2. ¿Es posible obtener el principal desde el objeto DirectoryEntry (o mediante cualquier otra clase disponible en System.DirectoryServices)?

EDIT:

Después de haber hecho un poco de lectura adicional ({1}{2}), ahora sabemos que el SID puede cambiar si el usuario se mueve de un grupo/dominio a otro. A la luz de esto, ¿sería mejor utilizar el GUID definido en DirectoryEntryProperties["objectGUID"] para identificar de manera única a un usuario?

Respuesta

3

El objectGUID es la mejor opción para identificar a un usuario cuenta. Resalto esto porque objectGUID es único y está fijado para una instancia de una cuenta. Si elimina y vuelve a crear la cuenta con el mismo distinguishedName obtendrá un objectGUID diferente. Entonces, objectGUID no identifica al usuario, identifica la cuenta.

Por lo tanto, si desea identificar la cuenta, use objectGUID.

A veces, las cuentas pueden ser eliminadas y recreadas por los administradores para resolver problemas. Si necesita identificar al usuario incluso después de que esto sucedió, debe elegir algo más en el objeto de la cuenta. Eso probablemente tendrá que depender de las políticas de definición de su cuenta. Tal vez usted tiene sAMAccountNames que no se basan en el nombre del usuario? ¿Tal vez los administradores llenan employeeid o employeeNumber? Tal vez ellos hacen cumplir la singularidad de displayNames?

Aquí hay un enlace a AD attribute info. Aquí hay un enlace al DirectoryEntry Properties.

+0

¿Es el objectGUID un GUID para la cuenta o un GUID para el tipo de objeto que representa la entrada del directorio? Además, ¿tiene un enlace a cualquier documentación que proporcione detalles sobre cada una de las propiedades de entrada de directorio? –

+0

Es un GUID para la cuenta individual. Puede verlo en Active Directory si usa ADSI Edit MMC Snap-in (http://technet.microsoft.com/en-us/library/cc773354(WS.10).aspx). – serialhobbyist

+0

He agregado enlaces a la publicación principal ya que la anterior parecía estar un poco destrozada. No estaba seguro de si deseaba las propiedades del objeto DirectoryEntry o el objeto AD. En el último caso, las personas con AD tienden a hablar de ellos como atributos. Por lo tanto, una instancia de una clase AD, como el usuario, tiene atributos como displayName. Una instancia de DirectoryEntry tiene una propiedad de propiedades que contiene una colección de atributos y sus valores. Debería llamarse Atributos, IMO. – serialhobbyist

Cuestiones relacionadas