2010-09-23 9 views
5

Tengo una aplicación que depende en gran medida de la autorización de los usuarios. Dentro de ella, estoy usando IPrincipal.IsInRole() para comprobar si los usuarios están en los grupos correctos:IPrincipal.IsInRole() solo funciona cuando trunque los nombres de los roles, ¿por qué?

IPrincipal principal = Thread.CurrentPrincipal; 
bool inRole = principal.IsInRole("mydomainname\some role with a long name"); 

Esto funciona bien para la mayor parte, pero falla (devuelve un resultado incorrecto) si el director es una instancia de una WindowsPrincipal. He encontrado que para que funcione correctamente, tengo para truncar el nombre de la función que me pase a ser de 32 caracteres (incluyendo el nombre de dominio y el \):

IPrincipal principal = Thread.CurrentPrincipal; // <- returns a WindowsPrincipal 
bool inRole = principal.IsInRole("mydomainname\some role with a lo"); 

truncar el nombre de la función a continuación, funciona correctamente ¿Por qué? ¿Es esto un problema/función/problema documentado? Tengo una idea de que puede estar relacionado con los dominios de Win2000, pero no puedo encontrar ninguna información sobre él.

Alguna información adicional:
Este es un problema porque la aplicación se puede configurar para utilizar el directorio activo o "a medida" para su autorización ("costumbre" ser cualquier proveedor de autorización que soporta una interfaz - podría ser SQL basado en archivos, etc.). Cuando se configura el modo personalizado, es muy probable que los roles no tengan que truncarse y, por lo tanto, no quiero tener que lidiar con este caso especial en mi código. Además, tengo otra parte de la aplicación que usa clases en el espacio de nombres System.DirectoryServices.AccountManagement para buscar membresías de grupos. Esto requiere el nombre completo del rol y no funciona si se truncan.

+4

Alguien una vez pensó: "32 caracteres son suficientes para cualquier papel" –

+0

@Henk: Me gusta :) Los personajes son 32 hace que sea bastante difícil de buscar ya que tienes muchos hits para 'Int32',' Win32' , etc ... – adrianbanks

Respuesta

7

Después de mucho ensayo y error, he descubierto lo que está pasando.

Cuando se crea un grupo en Active Directory, se le da dos nombres:

alt text

Parece ser que WindowsPrincipal utiliza el nombre del grupo anterior a Windows 2000IsInRole cuando se llama.

Después de buscar extensamente, esto no parece estar documentado en ninguna parte. Lo más cerca que me dieron fue this speculative answer a una pregunta similar aquí en SO.


En mi caso, los grupos estaba la consulta contra el dominio tenían un nombre largo, pero un nombre truncado anterior a Windows 2000 (trunca a 32 caracteres por alguna razón). Pasar el nombre largo no funciona, ya que estaba marcando el nombre del grupo incorrecto.

Cuestiones relacionadas