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

时间:2011-11-30 17:14:17

标签: c# .net sql-server connection-string

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

"Integrated Security=SSPI" 

在连接字符串中设置。

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

我不熟悉服务帐户或Active Directory,并且想知道是否有人能指出我正确的方向。有没有办法建立一个连接字符串,允许我的应用程序使用特定的Active Directory服务帐户连接到数据库?

6 个答案:

答案 0 :(得分:7)

连接字符串与此无关。

  

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

这意味着用户已请求您的应用程序作为服务帐户运行,而不是当前登录的用户。一种简单的方法是在runas /netonly

下简单地启动应用程序
runas /netonly /user:domain\serviceaccount MyWinFormsApp.exe

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

如果您的用户位于非AD网络上,那么您的用户就会要求一些非常复杂的内容(不同网络类型之间的跨域信任)。

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您可以通过将应用程序池的标识设置为特定用户来与特定用户连接到数据库。当然,该用户应该具有执行该池的所有必要访问权限。