Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <identity impersonate="true" userName="accountname" password="password" />
- /// <summary>
- /// Clase que permite suplantar el usuario identificado que ejecuta la aplicación en la máquina servidora
- /// </summary>
- public class SuplantarUsuarioIISBL : IDisposable
- {
- #region Librerías Externas
- public const int LOGON32_LOGON_INTERACTIVE = 2;
- public const int LOGON32_PROVIDER_DEFAULT = 0;
- WindowsImpersonationContext impersonationContext;
- [DllImport("advapi32.dll")]
- public static extern int LogonUserA(String lpszUserName,
- String lpszDomain,
- String lpszPassword,
- int dwLogonType,
- int dwLogonProvider,
- ref IntPtr phToken);
- [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- public static extern int DuplicateToken(IntPtr hToken,
- int impersonationLevel,
- ref IntPtr hNewToken);
- [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- public static extern bool RevertToSelf();
- [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
- public static extern bool CloseHandle(IntPtr handle);
- #endregion
- #region Métodos Públicos
- /// <summary>
- /// Inicia la suplantación de usuario por el indicado en los parámetros
- /// </summary>
- /// <param name="userName">Usuario</param>
- /// <param name="domain">Dominio de autenticación</param>
- /// <param name="password">Contraseña</param>
- /// <returns>True si consigue validar al usuario e impersonalizarlo</returns>
- public bool ImpersonateValidUser(String userName, String domain, String password)
- {
- if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(domain))
- {
- WindowsIdentity tempWindowsIdentity;
- IntPtr token = IntPtr.Zero;
- IntPtr tokenDuplicate = IntPtr.Zero;
- if (RevertToSelf())
- {
- if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
- LOGON32_PROVIDER_DEFAULT, ref token) != 0)
- {
- if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
- {
- tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
- impersonationContext = tempWindowsIdentity.Impersonate();
- if (impersonationContext != null)
- {
- CloseHandle(token);
- CloseHandle(tokenDuplicate);
- return true;
- }
- }
- }
- }
- if (token != IntPtr.Zero)
- CloseHandle(token);
- if (tokenDuplicate != IntPtr.Zero)
- CloseHandle(tokenDuplicate);
- }
- return false;
- }
- /// <summary>
- /// Devuelve la suplantación del usuario al original
- /// </summary>
- public void UndoImpersonation()
- {
- if (impersonationContext != null)
- {
- impersonationContext.Undo();
- impersonationContext.Dispose();
- impersonationContext = null;
- }
- }
- #endregion
- #region Implementación de la interfaz
- /// <summary>
- /// Revierte la suplantación de identidad si es que se ha producido y libera todos los recursos utilizados
- /// </summary>
- public void Dispose()
- {
- UndoImpersonation();
- }
- #endregion
- }
- // Datos del usuario a autenticar
- string u = ConfigurationManager.AppSettings["UsuariosAppLocalAutorizados.LecturaEscrituraDiscoUsuario"];
- string d = ConfigurationManager.AppSettings["UsuariosAppLocalAutorizados.LecturaEscrituraDiscoDominio"];
- string p = ConfigurationManager.AppSettings["UsuariosAppLocalAutorizados.LecturaEscrituraDiscoPassword"];
- using (SuplantarUsuarioIISBL suplantarUsuarioBL = new SuplantarUsuarioIISBL())
- {
- if (suplantarUsuarioBL.ImpersonateValidUser(u, d, p))
- {
- // Realiza las operaciones que tenga que hacer con ese usuario
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement