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

Posted

技术标签:

【中文标题】使用 Active Directory 服务帐户从 .NET 连接到 SQL Server【英文标题】:Connecting to SQL Server from .NET using an Active Directory Service Account 【发布时间】:2011-11-30 17:14:17 【问题描述】:

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

"Integrated Security=SSPI" 

在连接字符串中设置。

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

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

【问题讨论】:

这可能就是你要找的东西:***.com/questions/5029014/… 【参考方案1】:

连接字符串与此无关。

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

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

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

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

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

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

【讨论】:

谢谢。这是一个非常有帮助的回应。【参考方案2】:

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

这只是一个技巧,而不是正确的解决方案。

【讨论】:

【参考方案3】:

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

如果您的用户在非 AD 网络上,那么您的用户要求一些相当复杂的东西(不同网络类型之间的跨域信任)。

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

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

您可以通过将应用程序池的身份设置为该特定用户来将特定用户连接到数据库。当然,同一用户应该拥有执行该池所需的所有权限。

【讨论】:

以上是关于使用 Active Directory 服务帐户从 .NET 连接到 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Active Directory Graph 迁移到 Microsoft Graph

以编程方式在本地 Azure DevOps 服务器工作项注释中为 Active Directory 用户帐户添加 @提及(2021 年 1 月)

如何在 Linux 上使用 pyodbc 对 Active Directory 帐户使用用户/密码身份验证

我们可以使用 Azure Active Directory 提供对 blob/容器/存储帐户的访问吗?

SharePoint 使用客户端证书为没有 Active Directory 帐户的用户声明身份验证

从 Active Directory 获取用户密码