使用Windows身份验证的单声道到SQL Server

gbn*_*gbn 10 sql-server mono windows-authentication

快...

如何使用Windows上运行的Mono SQL客户端对SQL Server进行Windows身份验证,在连接字符串中没有用户名+密码?

更多...

  • 我们必须使用Mono为我们应用程序的某些组件支持多个平台
    这是一个我们无法改变的外部限制

  • 我们将运行在Windows上访问数据库的组件
    Mono SQL Client的可移植性/操作系统不可用的功能不会增加任何值

也就是说,在非Windows上运行的任何组件都不会访问SQL Server数据库

  • 该过程在一些Windows用户(真实用户,服务帐户,等等)下运行

  • 嵌入用户名和密码是一件坏事,
    无论你来自哪个角度

那么,我们如何让Mono SQL Client读取运行该进程的用户的NT Logon Token并将其传递给SQL Server?就像MS .net一样?

  • 是否有标记或设置没有详细记录

  • 我们需要实现自己的扩展吗?
    如果是这样,我们真的是第一个想要这样做的人吗?

还有其他5个问题(目前)标记为Mono和SQL-Server:他们没有回答这个问题......

Rem*_*anu 9

这并不像听起来那么容易实现.我相信你知道,Mono SqlClient支持NT身份验证:

具有NT身份验证的连接字符串格式:Server = hostname; Database = databaseName; User ID = windowsDomain\windowsUserid; Password = windowsPassword; Integrated Security = SSPI

但是,当然,您需要更简单的形式,Integrated Security=SSPI并让NT身份验证握手使用当前进程凭据.这就是问题所在.虽然很容易检索当前进程的用户名(标识),但进程无法发现它自己的凭据密码.在进行NT身份验证时,Windows进程实际上并不进行身份验证,而是要求Locas安全机构(也就是.LSASS.EXE,琐事:不要将调试器附加到它;))来验证此进程.这意味着任何想要实现相同目标的库必须使用相同的协议,即.请LSA对其进行身份验证.实际细节,好奇,是序列中AcquireCredentialHandle,InitializeSecurityContext,AcceptSecurityContext如描述使用SSPI.我没有研究SqlClient的单一来源,但我很确定他们使用一些GSS-API库进行身份验证,而不是 SSPI.因此,根据定义,他们需要知道,因为他们会做的Kerberos交换密码本身,不问LSA做代表他们.

正如你所知道的那样,这是猜测,而且更多的猜测在我身边,但我会惊讶地听到一个不同的故事.虽然可以分叉或修补Mono.Data.Tds并修改身份验证实现以使用SSPI而不是GSS,但根据定义,这将是一个非便携式Windows特定实现.考虑到Mono的#1吸引点不是 Windows特定的,我猜它没有什么动力.我担心你必须自己实施它.

  • @RemusRusanu解释是正确的.由于他声明的原因,Mono没有实现**集成的无密码连接到SQL服务器.当然这都是开源的,因此很可能将其添加到非Windows平台.务必与社区分享您的发现:-) (3认同)