2012-05-02 31 views
10

rápida ...Mono a SQL Server con Windows autenticación

Cómo utilizar la autenticación de Windows para SQL Server con el Mono SQL Client se ejecuta en Windows sin un nombre de usuario + contraseña en la cadena de conexión?

Más ...

  • tenemos que utilizar Mono para soportar múltiples plataformas para algunos componentes de nuestra aplicación
    Esta es una limitación externa que no podemos cambiar

  • Ejecutaremos los componentes que acceden a la base de datos solo en Windows
    Las características de portabilidad/OS-independientes del cliente Mono SQL no agregan ningún valor

Es decir, cualquier componente que se ejecuta en que no sea Windows no tendrán acceso a la base de datos de SQL Server

  • El proceso se ejecuta bajo algún usuario de Windows (usuario real, cuenta de servicio, lo que sea)

  • Incorporación de usuario y contraseñas es una mala cosa
    No importa qué ángulo usted viene de

Entonces, ¿cómo podemos habilitar el Cliente Mono SQL para leer el token de inicio de sesión de NT del usuario que ejecuta el proceso y pasarlo a SQL Server? Al igual que MS .net?

  • ¿Hay una bandera o configuración que no está bien documentada

  • qué necesitamos para implementar nuestra propia extensión?
    Si es así, ¿somos realmente la primera gente que quiere hacer esto?

Hay otros 5 preguntas (en la actualidad) Mono y etiquetado de SQL Server: no contestan esta ...

+3

No tengo una respuesta para usted, pero uno tiene que preguntarse si podría tratar AD como el servidor Kerberos que es y obtener un ticket para su autenticación. Este es un problema realmente interesante! –

+0

@BenThul: Lo investigaremos. Haga una respuesta por favor: voy a votar. También nos puede ayudar a resolver el problema. – gbn

+0

Oh ... No sé si consideraría lo que tengo como respuesta aún. Solo espero que te lleve a uno. –

Respuesta

9

Esto no es tan fácil de lograr como suena. Como estoy seguro de que sabe, Mono SqlClient tiene soporte para la autenticación NT:

tiene un formato de cadena de conexión para la autenticación de NT: servidor = nombre de host; Database = de databaseName; User ID = windowsDomain \ windowsUserid; contraseña = windowsPassword ; integrado de Seguridad = SSPI

Pero, por supuesto, desea que la forma más simple de Integrated Security=SSPI y dejar que el protocolo de autenticación NT utilizar las credenciales actuales del proceso. Y aquí se encuentra el problema.Aunque es trivial recuperar el nombre de usuario (identidad) del proceso actual, es imposible que un proceso descubra sus propias credenciales contraseña. Al realizar la autenticación NT, un proceso de Windows no realiza la autenticación, sino que solicita el Locas Security Authority (también conocido como LSASS.EXE, trivia: no adjunte un depurador;)) para autenticar este proceso. Lo que significa que cualquier biblioteca que desee lograr lo mismo debe usar el mismo protocolo, es decir. pide a LSA que lo autentique. Los detalles reales, para los curiosos, están en la secuencia de AcquireCredentialHandle, InitializeSecurityContext, AcceptSecurityContext según se describe en Using SSPI. No estudié la fuente mono para SqlClient, pero estoy bastante seguro de que utilizan alguna biblioteca GSS-API para la autenticación, no SSPI. por lo tanto, por definición, requieren conocer la contraseña, ya que van a hacer el intercambio de Kerberos ellos mismos, no pedirle a LSA que lo haga en su nombre.

Esto es, como puede ver, la especulación y más de una suposición de mi parte, pero me sorprendería escuchar una historia diferente. Si bien es posible bifurcar o parchar Mono.Data.Tds y modificar la implementación de la autenticación para usar SSPI en lugar de GSS, esto, por definición, sería una implementación no portátil de Windows específica. Supongo que hay pocos incentivos, dado que el punto de atracción número 1 de Mono es que es , no específico de Windows. Me temo que tendrás que implementarlo por tu cuenta.

+0

Tenemos que usar Mono por diferentes razones: pero la no portabilidad no es un problema para los componentes que se conectan a la base de datos. Y podemos evitar las contraseñas en texto sin formato si lo implementamos – gbn

+0

No estoy diciendo que no tenga sentido para * usted *. Estoy diciendo que probablemente no esté implementado por mono. –

+3

@RemusRusanu la explicación es correcta. Mono no implementa ** conexiones ** sin contraseña a SQL Server por las razones que indicó. Por supuesto, todo esto es de código abierto, por lo que es posible agregarlo a una plataforma que no sea de Windows. Asegúrese de compartir sus hallazgos con la comunidad :-) – poupou

Cuestiones relacionadas