2009-09-10 27 views
19

Tengo una aplicación web MVC en una intranet y quiero poder crear archivos en nuestro servidor FTP para enviarlos a socios externos.Suplantación de identidad en ASP.NET MVC

El código para la suplantación usa WindowsImpersonationContext.

System.Security.Principal.WindowsImpersonationContext impersonationContext; 
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); 

StreamWriter sw = System.IO.File.CreateText("PathOnFTPServer"); 
sw.Write("data"); 

impersonationContext.Undo(); 

Esto es lo que está pasando y la razón de mi pregunta: ¿

Pre suplantación

User.Identity.Name: [mis credenciales de Windows]

System.Security.Principal. WindowsIdentity.GetCurrent(). Nombre: NT AUTHORITY \ NETWORK SERVICE

Mensaje suplantación

User.Identity: [mis credenciales de Windows]

GetCurrent.Name: [mis credenciales de Windows]

Impersonate Deshacer

User.Identity: [mis credenciales de Windows]

GetCurrent.Name: NT AUTHORITY \ NETWORK SERVICE

Entonces, antes de suplantar, el usuario actual es la Cuenta del sistema, pero después de la suplantación, está usando mi cuenta de dominio de Windows que tiene permiso para crear archivos de texto en el servidor FTP. El código funciona localmente utilizando el servidor web de Visual Studio, pero no cuando lo despliego en IIS en nuestro servidor de prueba.

Recibo un error de acceso denegado. ¿Cuál sería el motivo del error cuando se está suplantando al usuario correcto?

Respuesta

22

La suplantación permite la suplantación máquina a máquina, por lo que el navegador del cliente y el servidor están en la misma página cuando se trata de la suplantación. Cuando intenta acceder al recurso compartido de red, la computadora no confía en las credenciales suplantadas.

Debe habilitar la delegación para el equipo IIS en Active Directory. Vaya a Usuarios y equipos de Active Directory, busque la computadora, haga clic en Propiedades y "Confiar en la computadora para delegación". (Puede que necesite reiniciar IIS para que esto funcione, no lo recuerdo).

Hay mucho más teoría que esto que no entiendo completamente, pero esto debería funcionar. Si es correcto o no, ¡alguien más podría comentar!

Además, la razón por la que funciona en su máquina de desarrollo es que el servidor de desarrollo se ejecuta como desarrollador, no como Servicio de red local.


Un enlace decente:

http://msdn.microsoft.com/en-us/library/cc949004.aspx

¿Cuál es la diferencia entre la suplantación y delegación?

La suplantación transfiere la identidad original de la persona que llama a los recursos de fondo en la misma computadora. La delegación transfiere la identidad del llamante original a los recursos de fondo en computadoras que no sean la computadora que ejecuta el servicio.

Por ejemplo, si un servicio se está ejecutando dentro de IIS sin suplantación, el servicio tendrá acceso a recursos utilizando la cuenta de ASP.NET en IIS 5.0, o la cuenta de Servicio de red en IIS 6.0. Con la suplantación, si el cliente se conecta usando la cuenta original de la persona que llama, el servicio accederá a recursos como una base de datos de SQL Server en la misma máquina utilizando la cuenta original de la persona que llama en lugar de la cuenta ASP.NET del sistema. La delegación es similar, excepto que la base de datos de SQL Server podría estar en una máquina diferente que esté remota al servicio.

+1

Esto era exactamente lo que estaba intentando descubrir. No me di cuenta de que la suplantación no se aplicaba a las máquinas. –

+0

Hombre, estuve probando Suplantación por un par de días, ¡y de repente me haces darme cuenta de que deberíamos irnos con la delegación! Muchas gracias –

Cuestiones relacionadas