2012-06-21 24 views
7

¿Por qué el código siguiente funciona bien cuando ejecuto mi aplicación web localhost pero no cuando lo instalo en un servidor IIS?System.DirectoryServices.AccountManagement.UserPrincipal - localhost pero no iis

using (HostingEnvironment.Impersonate()) 
{ 
    UserPrincipal activeUser = UserPrincipal.Current; 
    String activeUserSid = activeUser.Sid.ToString(); 
    String activeUserUPN = activeUser.UserPrincipalName; 
} 

Por favor, no sugieren me quedo con HttpContext.Current.User, ya que no proporciona acceso a SID o UPN sin llamadas adicionales a Active Directory.

La aplicación web será utilizada por usuarios autenticados de Windows de tres dominios separados, el servidor web está alojado en un cuarto dominio. El grupo de aplicaciones está configurado para ejecutarse con la identidad NetworkService y la configuración de la aplicación web tiene la suplantación de identidad establecida en verdadero.

El mensaje de error cuando se ejecuta en IIS es:

Error in Page_Load(): UserPrincipal.Current.
System.InvalidCastException: Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal' to type 'System.DirectoryServices.AccountManagement.UserPrincipal'.
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.get_Current()
at webapp.Details.Default.Page_Load(Object sender, EventArgs e)

EDITAR: Probado tanto en lo siguiente y por desgracia conseguir el mismo error.

UserPrincipal userPrincipal = UserPrincipal.Current; 
Response.Write(userPrincipal.Name); 
Principal userOrGroup = UserPrincipal.Current; 
Response.Write(userOrGroup.Name); 

Respuesta

1

Parece necesidad de algún otro método para determinar usuario.
Aquí descripción de msdn para la propiedad:
"Obtiene un objeto principal de usuario que representa el usuario actual bajo el cual se está ejecutando el subproceso".
Por lo tanto, UserPrincipal.Current devuelve al usuario bajo lo que se está ejecutando IIS.

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal.aspx

+0

Creo que tienes razón. Esto tampoco funciona ... var wi = HttpContext.Current.User.Identity como WindowsIdentity; usando (wi.Impersonate()) { UserPrincipal up = UserPrincipal.Current; activeUserUPN = up.UserPrincipalName; activeUserSid = up.Sid.ToString(); } – RichardD

+1

"el usuario actual bajo el cual se está ejecutando el subproceso" en IIS es probablemente la identidad del grupo de aplicaciones de IIS; pero cuando se ejecuta en su PC en Visual Studio, Casini o IIS Express, se ejecuta como usted. En ese caso, su identidad es compartida por el cliente que solicita la página y el servidor de desarrollo que se ejecuta localmente. –

3

que tenía un montón de cuestiones que despliegan UserPrincipal.Current y todavía no entienden completamente por qué.

Finalmente terminé usando PrincipalSearcher, y creé la siguiente función para hacer lo que creía que era UserPrincipal.Current.

private UserPrincipal GetActiveDirectoryUser(string userName) 
{ 
    using(var ctx = new PrincipalContext(ContextType.Domain)) 
    using(var user = new UserPrincipal(ctx) { SamAccountName = userName}) 
    using(var searcher = new PrincipalSearcher(user)) 
    { 
     return searcher.FindOne() as UserPrincipal; 
    } 
} 

y pasé System.Web.HttpContext.Current.User.Identity.Name en ese método como el nombre de usuario.

+0

Aparece el siguiente error: 'System.ObjectDisposedException: no se puede acceder a un objeto eliminado. Nombre del objeto: 'PrincipalContext'. en System.DirectoryServices.AccountManagement.PrincipalContext.CheckDisposed() en System.DirectoryServices.AccountManagement.PrincipalContext.get_ContextType() en System.DirectoryServices.AccountManagement.Principal.get_Name() en System.String.Concat (Object [] args) en Admin_Click (Object Sender, EventArgs e) ' – SearchForKnowledge

+1

Probé varias cosas en mi aplicación MVC. 'DirectoryEntry de = new DirectoryEntry (" WinNT: // "+ Environment.UserDomainName + "/" + userId); cadena usuario = de.Properties [ "Nombre completo"] Value.ToString(); '. Luego probé' System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName; ' trató entonces la solución, y fue el solo uno para trabajar cuando se despliega en mi servidor de producción ... no estoy seguro de por qué. Todo funcionó localmente ... –

Cuestiones relacionadas