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

问题描述:

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

"Integrated Security=SSPI" 

设置。

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

我不熟悉服务帐户或活动目录,并想知道是否有人可以指引我正确的方向是否有某种方式构建连接字符串,这将允许我的应用程序使用特定的Active Directory服务连接到数据库帐户?

+0

这可能是你在找什么:http://*.com/questions/5029014/how-to-add-active-directory-user-group-as-login-in-sql-服务器 – jasonp

连接字符串与此无关。

用户要求,他们必须连接到MS SQL Server的 选择使用Active Directory服务帐户,而不是向网络用户 帐户

这也就意味着用户已请求您的应用程序作为服务帐户运行,而不是当前登录的用户。一个简单的方法来做到这一点是runas /netonly下简单地启动应用程序:

runas /netonly /user:domain\serviceaccount MyWinFormsApp.exe 

这样,你的应用程序作为网络上的域名服务帐户,它会使用domain\serviceaccount凭据连接到SQL Server。这将满足您的客户的要求,至少在浅表的粗略外观。

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

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

+0

谢谢。这是一个非常有用的回应。 – Russell

“Integrated Security = SSPI”将传递当前登录的用户的凭据。 unt只是另一个用户,虽然你实际上必须在连接字符串中指定。我假设默认情况下,您只想通过使用“集成安全= SSPI”传递登录用户,但提供指定登录凭据的选项,在这种情况下,您将使用指定用户名的连接字符串和密码。

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

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

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

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

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

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

2)提示用户输入其登录凭证并执行AD登录以验证其凭据,然后使用.Net框架模拟登录的用户。 This MSDN link,虽然对于ASP.Net,有你需要的基本信息,特别是关于Impersonating by Using LogonUser的章节。

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

这是我试过的连接字符串,它对我有用。是的 - 需要Integrated Security=SSPI

"Data Source=myServerName\myInstanceName;Initial Catalog=myInitialDB;App=myApplication;Integrated Security=SSPI;"