使用Active Directory服务帐户从.NET连接到SQL Server

我有用C#编写的连接到SQL Server数据库的Winforms应用程序。 当我连接到SQL Server时,我建立一个连接字符串,它可以包含SQL Server登录详细信息或使用Windows身份验证,在这种情况下,我省略了用户名和密码并使用

"Integrated Security=SSPI" 

在连接字符串中设置。

现在,用户请求他们可以选择使用Active Directory服务帐户连接到MS SQL Server,而不是使用网络用户帐户(这是我假设使用Windows身份验证的连接将会通过。

我对服务帐户或Active Directory不熟悉,并想知道是否有人能指引我朝着正确的方向发展。 是否有某种方法构建连接字符串,该连接字符串将允许我的应用程序使用特定的Active Directory服务帐户连接到数据库?


连接字符串与此无关。

用户请求他们可以选择使用Active Directory服务帐户而不是网络用户帐户连接到MS SQL Server

这意味着用户请求您的应用程序作为服务帐户运行,而不是以当前登录的用户身份运行。 一个简单的方法是简单地在runas /netonly下启动应用程序:

runas /netonly /user:domainserviceaccount MyWinFormsApp.exe

这样,您的应用程序将作为网络上的域服务帐户运行,并且它将使用domainserviceaccount凭证连接到SQL Server。 这将满足您的客户的要求,至少在浅表的粗略外观。

如果使用runas的解决方案不令人满意(客户可能会抱怨它需要启动应用程序的用户知道domain serviceaccount密码),那么事情会变得更复杂一些。 正确的做法是将应用程序拆分为两部分,一个是在登录用户凭据下运行的UI表示层.exe应用程序,另一个是作为服务在域 serviceaccount凭据下运行的业务逻辑层组件。 这两个组件使用您选择的IPC进行通信(通常是WCF)。 您可能已经意识到,这需要重新编写应用程序。

有些人可能会建议在打开与数据库的连接之前让您的应用程序模拟domain serviceaccount。 我强烈劝阻,因为serviceaccount密码存储/检索混乱。 由于应用程序将被要求知道serviceaccount密码以模拟它,所以登录运行该应用程序的用户将知道该密码或很容易找到它(如果应用程序没有办法阻止他找到它)可以找到它)。 由于无论如何登录的用户都可以访问domainservice密码,所以他可以使用runas /netonly解决方案。 这最终解释了为什么runas解决方案只是一个简单的烟雾和镜像解决方案:客户可能请求他所要求的唯一原因是他想要将登录的用户的权限与应用程序的权限(即。不要给每个员工提供SQL Servera)。 由于runas解决方案(以及在应用程序中模拟)要求登录用户知道服务帐户密码,因为hte登录用户可以随时使用它希望的服务帐户密码并提升权限,所以不会发生权限分离他的特权随意访问SQL Server数据库。 因此,值得讨论的唯一解决方案是将应用程序分为两部分。


连接字符串“Integrated Security = SSPI”将把当前用户凭据传递给SQL Server。 但是,如果用户想要在不更改连接字符串的情况下使用其他Active Directory用户,请使用操作系统提供的运行方式功能。 如果您使用的是Windows 7,请按住Shift并右键单击该exe并选择以其他用户身份运行。

这只是一个黑客而非适当的解决方案。


一般来说,活动目录帐户与网络用户帐户相同。 有一些例外情况,例如工作组和非AD网络,但在大多数情况下,它们都是相同的。

如果您的用户位于非AD网络上,那么您的用户会要求相当复杂的事情(不同网络类型之间的跨域信任)。

但是,如果您的用户在AD网络中运行,但想以不同于其交互式用户的用户身份登录(例如,他们以MJames身份登录到他们的计算机,但希望以FJones身份登录数据库),那么你有两个选择:

1)告诉他们他们需要以请求的用户身份登录到他们的机器。

2)提示用户输入其登录凭证并执行AD登录以验证其凭据,然后使用.Net框架模拟登录的用户。 这个MSDN链接,尽管对于ASP.Net,有你需要的基本信息,特别是关于Impersonating by Using LogonUser进行Impersonating by Using LogonUser的部分。

在上述任何情况下, Integrated Security=SSPI命令字符串参数将作为用户当前登录的AD用户连接到SQL Server,直接连接到计算机或通过模拟。

链接地址: http://www.djcxy.com/p/74073.html

上一篇: Connecting to SQL Server from .NET using an Active Directory Service Account

下一篇: Login failed for user 'DOMAIN\MACHINENAME$'