8

Extendiendo UserPrincipal para aprovechar sus propiedades integradas ... al tener un problema cuando sobrecargamos el método FindByIdentity().Extendiendo UserPrincipal; FindByIdentity() falla

del ejemplo de Microsoft en http://msdn.microsoft.com/en-us/library/bb384372%28VS.90%29.aspx (partes excluidos por razones de brevedad):

[DirectoryRdnPrefix("CN")] 
[DirectoryObjectClass("inetOrgPerson")] 
public class InetOrgPerson : UserPrincipal { 

    // Implement the overloaded search method FindByIdentity 
    public static new InetOrgPerson FindByIdentity(PrincipalContext context, 
                string identityValue) { 
     return (InetOrgPerson)FindByIdentityWithType(context, 
                typeof(InetOrgPerson), 
                identityValue); 
    } 

    // Implement the overloaded search method FindByIdentity 
    public static new InetOrgPerson FindByIdentity(PrincipalContext context, 
                IdentityType identityType, 
                string identityValue) { 
     return (InetOrgPerson)FindByIdentityWithType(context, 
                typeof(InetOrgPerson), 
                identityType, 
                identityValue); 
    } 
} 

Si tomo el código exacto del ejemplo de MSDN y pegarlo en mi aplicación, que no funciona. La llamada a InetOrgPerson.FindByIdentity() devuelve null, como tal:

if (null == InetOrgPerson.FindByIdentity(principalContext, UserName)) { 
    throw new Exception("bah"); 
} 

De hecho, desde dentro InetOrgPerson.FindByIdentity(), la llamada a FindByIdentityWithType() devuelve null, como tal:

if (null == FindByIdentityWithType(context, typeof(InetOrgPerson), identityType, identityValue) { 
    throw new Exception("bah"); 
} 

Sin embargo, la llamada:

FindByIdentityWithType(context, typeof(UserPrincipal), identityType, identityValue) 

me da el objeto de usuario que quiero. Excepto que no puedo usar eso, porque no se puede convertir al objeto InetOrgPerson que necesito devolver.

¿Qué ofrece? Esperaría que el propio código de ejemplo de Microsoft funcionara, pero no es así, así que, naturalmente, el código que estoy tratando de escribir basado en el ejemplo tampoco funciona. ¿Alguien ha hecho esto?

¡Gracias de antemano! James

Respuesta

12

Asegúrese de que el usuario que está buscando en realidad pertenece a la clase inetOrgPerson.

+2

Sí, ese era el problema. No me di cuenta de que el atributo 'DirectoryObjectClass' que establecí vinculaba la clase a una clase en AD. Así que ahora entiendo que cuando realizo una búsqueda a través del 'FindByIdentity' de esta clase, estoy limitando mi búsqueda a objetos en AD de la clase 'inetOrgPerson', de los cuales no hay ninguno en nuestra AD. En mi caso, quiero establecer 'DirectoryObjectClass' en 'usuario'. Eso es realmente genial. ¡Gracias! –

+0

Increíble, me arregló un problema también – nokturnal