none
Impersonate en aplicaciones C# WIN FORM RRS feed

  • Pregunta

  • Buenos días, tengo un requerimiento del cliente que tiene SQLServer 2012 y solo habilita acceso con credenciales del AD genéricas (un usuario para cada BD, diferente al usuario logueado en Windows)

    En las App WEB pudimos solucionarlo desde el Web.Config usando el impersonate e Integrated Security=SSPI y funcionó ok

    El problema lo tengo con aplicaciones viejas en WIN, usando Framework 3.5, no logro establecer una conexión con credenciales del AD, diferentes para cada Base de datos (la misma App accede a varias). Probé con EXECUTE AS pero esto no resuelve todos los problemas, sobre todo haciendo join entre tablas de diferentes BD

    ¿Es posible hacer esta implementación, o debemos solicitar al DBMA que habilite usuario de SQL?

    ¿Existe alguna justificación fuerte que nos permita defender el uso de usuarios SQL sobre los de dominio?

    Este tema nos urge ya que estamos en pre implementación

    Desde ya muchas gracias

    viernes, 13 de mayo de 2016 15:05

Respuestas

Todas las respuestas

  • El remedio es usar la API de Windows LogonUser para impersonar al usuario de AD. Tienes un ejemplo aquí:

    https://msdn.microsoft.com/en-us/library/chf6fbt4(v=vs.110).aspx

    Sin embargo, puestos a hacer esto, sería preferible habilitar la autenticación de SQL en el servidor. La razón por la que se suele evitar esto es para que el software no tenga que contener en ningún sitio las passwords de esos usuarios de SQL. Pero si usas la API para hacer la impersonación, se necesita que el software tenga la password de la cuenta de dominio, con lo que no hemos arreglado nada. Para eso es preferible usar la password de SQL y evitar la impersonación.

    Otro remedio sería usar un Rol de Aplicación en SQL Server. De esta manera, cada usuario abriría la conexión con autenticación integrada usando su cuenta de Windows, y luego el programa usaría una llamada a sp_setapprole para activar el rol de aplicación (que se puede crear en SQL Server sin necesidad de activar el Modo Mixto). Los permisos necesarios se le concederían al Rol. Tiene la ventaja de que en los audits del servidor quedaría grabado quien fue el usuario original que desencadenó cada operación auditada, en lugar de quedar todas a nombre de la misma cuenta de AD. Pero no resuelve el problema de almacenar una password en la aplicación, ya que el rol de aplicación también necesita una password.

    viernes, 13 de mayo de 2016 15:23
  • Puede usar la función nativa de Windows LogonUser() para obtener un token que puede usar en .Net a través deWindowsIdentity.Impersonate().  En este último enlace verá un ejemplo completo de personificación.

    Jose R. MCP
    Code Samples

    viernes, 13 de mayo de 2016 15:26
    Moderador
  • hola

     locked impersonation and Run as Administator

    se me ocurre usando la api de windows que implementa en los articulos, entonces despues un contexto de ejecucion especificos para lanzar estas aplicaciones

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 13 de mayo de 2016 15:34
  • Gracias Alberto y José por la pronta respuesta!
    Entiendo lo del WindowsIdentity.Impersonate(), pero esto no sería como un RunAs temporal?
    Pregunto porque una de las funcionalidades es enviar un correo usando Outlook con la cuenta del usuario logueado, o escribir un PDF en la carpeta "mis documentos" de ese usuario y creo que así usaría la cuenta del usuario suplantador (las App se ejecutan en un Citrix).Perdón pero no me doy cuenta de cómo implementar esto y mantener los joins de tablas en diferente BD (y usuario) por un lado, y por otro si no entendí mal a Alberto, debería tener la credencial de los usuarios para volver al Logon con el usuario original ¿o me equivoco?    Gracias de nuevo!
    viernes, 13 de mayo de 2016 15:36
  • Pues sí, es algo como un Run As.  Es lo que neceista, o ¿será que le parece extraño?  Durante el bloque de personificación haga estrictamente lo relacionado a base de datos y ya.  Luego revierta y haga lo demás.

    Jose R. MCP
    Code Samples

    viernes, 13 de mayo de 2016 15:41
    Moderador
  • La verdad es que me parecía extraño, veré como implemento esta solución; el problema es que es una App un poco vieja y bastante grande, con lo cual veo un impacto difícil de afrontar, pero tampoco parece haber otra solución mejor

    Muchas gracias por las respuestas !

    viernes, 13 de mayo de 2016 15:48