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

问题描述 投票:2回答:6

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

"Integrated Security=SSPI" 

在连接字符串中设置。

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

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

c# .net sql-server connection-string
6个回答
7
投票

连接字符串与此无关。

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

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

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

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

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

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


3
投票

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

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


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,直接连接到计算机或通过模拟。


0
投票

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


0
投票

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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.