2010-09-12 21 views
16

Tengo una pequeña solución de C# utilizada para verificar las credenciales de los usuarios. Funciona bien para dos de mis compañeros de equipo, pero en mi PC obtengo una excepción.. Servicios de directorio de .Net arroja una extraña excepción

El código relevante:

PrincipalContext context = new PrincipalContext(ContextType.Domain); 
if (context.ValidateCredentials(System.Environment.UserDomainName + "\\" + usr, pwd)) 
    return true; 
else 
    return false; 

y la excepción es:

DirectoryOperationException, "El servidor no puede manejar las solicitudes de directorio.".

Intenté crear contexto con el nombre explícito del servidor y el número de puerto 636, pero esto tampoco me ayudó.

¿Alguna idea?

+0

Por lo menos aquí se ayudó, tal vez ver a mi último comentario: http://stackoverflow.com/questions/3694919/nets-directory-services-throws-a-strange-exception#comment4025606_3694964 – Noich

Respuesta

6

tuve este problema: las cosas estaban trabajando en mi máquina dev pero no funcionan en el servidor. Resultó que IIS en el servidor estaba configurado para ejecutarse como LocalMachine. Lo cambié a NetworkService (el predeterminado) y las cosas comenzaron a funcionar.

Básicamente, compruebe el usuario del grupo de aplicaciones si se está ejecutando en IIS.

+0

¿Puedo hacer programáticamente en C# comprobar el usuario del grupo de aplicaciones si esto se ejecuta en IIS? – Kiquenet

+0

Obtener el usuario de la agrupación de aplicaciones mediante programación: http://stackoverflow.com/questions/10101162/get-the-application-pool-identity-programmatically – fredw

1

¿Quizás necesite el parche?

Y usted es un administrador o el id de que el servicio se está ejecutando bajo una administración a la derecha de PC?

Supongo que ya se veía en esto: "(. El servidor no puede manejar las solicitudes de directorio‘)

puede recibir un menos atento DirectoryOperationException’lo ISN' Tan gracioso es que ni siquiera trató de comunicarse con el servidor. La solución fue agregar el número de puerto al servidor. Por lo tanto, en lugar de pasar el "Servidor" para abrir el LdapConnection, pasé al servidor: 636 "Por cierto, LDAPS es el puerto 636, en lugar del puerto 389 editado por LDAP ".


Buen punto, yo no esperaría que Win7/.NET 3.5 se necesitaría ese parche. ¿Qué hay de la informacion proporcionada en esta pregunta: ¿

+0

Tal vez tiene algo mal aquí, pero la revisión es para .Net2, y como utilizo 3.5, no tengo .Net2 SP1 instalado, lo que hizo que la revisión fuera enojada :) Acerca de la cita - ¡Lo vi, pero muchas gracias de todos modos! – Noich

+0

Ok, parece que la revisión no es para win7 - SP1 no se puede instalar. – Noich

+0

El problema era que este código obtenía un servidor de forma dinámica, por lo que recibía un servidor que no estaba ejecutando Windows 2008. Al obtener un servidor específico que ejecutaba Win2008, todo comenzaba a funcionar nuevamente. ¡Viva! – Noich

49

Tuve este problema usando IIS Express y VS 2010. Lo que lo solucionó fue un comentario sobre otro hilo.

Validate a username and password against Active Directory?

pero yo voy a ahorrar el clic y busco ... :) Sólo añadir ContextOpations.Negotiate a validar las credenciales que llaman como a continuación.

bool valid = context.ValidateCredentials(user, pass, ***ContextOptions.Negotiate***); 
+5

Esto debe marcarse como resolución. Experimenté esta excepción en una aplicación de prueba simple (en realidad, un pequeño programa WPF) que arrojó la excepción solo cuando estaba conectado al dominio de destino a través de VPN. Siempre que experimente problemas de autenticación al usar una VPN, dé una oportunidad a ContextOptions.Negociar. – Pilsator

+0

¿Por qué *** reason *** usando 'ContextOptions.Negotiate'? – Kiquenet

+2

@Kiquenet Como explica Brett Veenstra: ... ". NET usa las siguientes tecnologías de forma predeterminada: LDAP + SSL, Kerberos y luego RPC. Sospecho que RPC está desactivado en su red (¡bien!) Y Kerberos no se usa realmente por .NET a menos que explícitamente lo expliques usando ContextOptions.Negotiate "... – pwDev

2

tuve que acaba de crear un nuevo grupo de aplicaciones y asignarle .NET 2.0, a continuación, asignar el nuevo grupo de aplicación a nuestra aplicación web, y que comenzó a trabajar. Teníamos .NET 3.5 SP2, por lo que la revisión no era ideal para nosotros. Como el servicio WWW generalmente es un sistema local, también lo cuestioné. Pero dado que era .NET y relacionado con la seguridad, di una oportunidad al grupo de aplicaciones primero y funcionó.

Cuestiones relacionadas