2012-06-13 33 views
12

Estoy usando el método UserPrincipal.Current.ToString() en el dominio para obtener el usuario actual del dominio con dominio válido. pero cuando estoy viendo en una cadena de error al dar su alojada en servidor IIS:No se puede convertir el objeto de tipo en System.DirectoryServices.AccountManagement.GroupPrincipal

Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal' 
      to type 'System.DirectoryServices.AccountManagement.UserPrincipal'. 
+1

¿Esto ayuda? http://stackoverflow.com/a/10848934/43846 – stuartd

Respuesta

14

que tenían el mismo problema. Funcionó perfectamente en mi máquina local pero cuando se implementó en IIS en el servidor falló. Al final tuve que cambiar dos cosas para que funcione:

  1. Cambiar la autenticación de "Autenticación de Windows" (how-to)

  2. En lugar de utilizar la corriente, hacerlo en dos pasos: (source)

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, User.Identity.Name);

Y para finalmente obtener el nombre (o cualquier otra información), utilicé user.DisplayName.

+3

esto arroja un error para mí The (& (objectCategory = user) (objectClass = user) (| (UserPrincipalName =) (distinguishedName =) (name =))) search el filtro no es válido Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código. Detalles de la excepción: System.ArgumentException: El filtro de búsqueda (& (objectCategory = user) (objectClass = user) (| (userPrincipalName =) (distinguishedName =) (name =))) no es válido – Kurkula

5

he visto esta excepción cuando se ejecuta en IIS 7 en Windows 7.

System.Security.Principal .WindowsIdentity.GetCurrent(). El nombre devuelve "IIS APPPOOL \ ASP.NET v4.0".

Ésta es not a real user account, que en parte explica lo que está ocurriendo, aunque en mi humilde opinión UserPrincipal.Current debe manejar esta situación con más gracia.

creo que es un error y han creado un error en Conectar: ​​

http://connect.microsoft.com/VisualStudio/feedback/details/748790/userprincipal-current-throws-invalidcastexception

Como solución, utilice System.Security.Principal.WindowsIdentity.GetCurrent() para obtener la identidad de un AppPool IIS.

2

El problema aquí es que la propiedad UserPrincipal.Current intentará acceder al contexto del hilo actual. Sin embargo, sin la suplantación ASP.NET, significa que la identidad será la identidad configurada del grupo de aplicaciones. Incluso con la suplantación ASP.NET, tiene que acceder al Active Directory de alguna manera y, por lo tanto, necesita autenticarse contra el controlador de dominio. Si el método de autenticación seleccionado en IIS no lo proporciona, es probable que se produzca un error similar.

En mi experiencia, solo funcionará la autenticación "BÁSICA" y una versión 100% correctamente implementada de "KERBEROS". Tenga en cuenta que Kerberos no es realmente compatible con la forma en que se manejan los grupos de aplicaciones y los SPN, y es probable que falle. NTLM, que es la alternativa para la autenticación de Windows en IIS, no funcionará debido a la falta de contraseña en el servidor.

Una buena lectura acerca de los problemas de HTTP/Kerberos es: http://blogs.msdn.com/b/friis/archive/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iis-ie.aspx

Cuestiones relacionadas