Suplantación en ASP.NET MVC

Tengo una aplicación web MVC en una intranet y quiero poder crear archivos en nuestro servidor FTP para enviar a socios externos.

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á sucediendo y el motivo de mi pregunta:

Pre Personificación

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

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

Post Suplantación

User.Identity: [mis credenciales de Windows]

GetCurrent.Name: [mis credenciales de Windows]

Suplantar 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?

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 suplantación y delegación?

La suplantación fluye la identidad de la persona que llama original a los recursos de back-end 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 ASP.NET en IIS 5.0 o la cuenta del 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.