使用 Windows 集成安全性访问 SQL Server
如果您的应用程序运行在基于 Windows 的 Intranet 上,则也许可以将 Windows 集成身份验证用于数据库访问。集成安全性使用在操作系统线程上建立的当前 Windows 标识来访问 SQL Server 数据库。然后,您可以将 Windows 标识映射到 SQL Server 数据库和权限。
若要使用 Windows 集成身份验证连接到 SQL Server,必须标识是以什么 Windows 标识来运行 ASP.NET 应用程序的。还必须确保已授予该标识访问 SQL Server 数据库的权限。本主题包括显示 ASP.NET 应用程序的当前 Windows 标识的代码示例。
如果 SQL Server 与 Web 服务器在不同的计算机上,则 Windows 标识必须能够通过网络传递给 SQL Server 的远程实例。(已使用 Kerberos 身份验证正确进行配置的 Windows 网络能够实现此目的。)但是,在 ASP.NET 应用程序的操作系统线程上建立的 Windows 标识也许无法正确地传递给远程 SQL Server,这取决于 identity 配置元素中的设置。
您可以为网站的辅助进程标识提供特定的用户名和密码(如如何:使用映射的 Windows 域用户访问 SQL Server 中所示),也可以模拟 Internet 信息服务 (IIS) 提供的已验证的标识。若要模拟 IIS 提供的 Windows 标识,请将 identity 配置元素的 impersonate 属性设置为 true,如下面的示例所示:
<system.web>
<identity impersonate="true" />
</system.web>
在 IIS 中,只有基本身份验证使用通过网络传递给远程 SQL Server 的安全标记来使用户登录。默认情况下,与 identity 配置元素设置一起使用的其他 IIS 安全模式将不会生成可以通过远程 SQL Server 的身份验证的标记。
如果网站配置为仅支持 IIS 中的匿名访问,则从 IIS 传递的安全标记将是 IIS 中配置的匿名访问的 Windows 用户帐户的安全标记。匿名用户帐户可用于通过远程 SQL Server 的身份验证。但是,默认的匿名用户帐户是本地计算机帐户,因而将不会作为远程 SQL Server 上的帐户存在。您可以更改 IIS 匿名帐户以使用域帐户,也可以镜像远程 SQL Server 上的本地计算机帐户(方法为在远程 SQL Server 上创建一个具有相同用户名和密码的本地帐户)。此外,还必须将 IIS6 的 LogonMethod 元数据库属性设置为允许通过网络传递凭据的选项。例如,元数据库设置MD_LOGON_NETWORK_CLEARTEXT 允许通过网络传递登录凭据。
如果您不确定您的应用程序的 Windows 标识,并且不确定标识是否使用可以通过网络传递的标记登录,可以运行下面的 ASP.NET 页(作为应用程序的一部分)来显示 Windows 标识的名称以及一个指示是否可以通过网络传递标识的值。请注意,下面的示例不考虑是否已经成功地为您的域设置了 Kerberos 委托。
%@ Page Language="C#" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
<script runat="server"> public bool WillFlowAcrossNetwork(WindowsIdentity w)
{
foreach (SecurityIdentifier s in w.Groups)
{
if (s.IsWellKnown(WellKnownSidType.InteractiveSid)) { return true; }
if (s.IsWellKnown(WellKnownSidType.BatchSid)) { return true; }
if (s.IsWellKnown(WellKnownSidType.ServiceSid)) { return true; }
} return false;
} </script>
</head>
<body>
<%
WindowsIdentity current = WindowsIdentity.GetCurrent();
Response.Write(current.Name + ", " + WillFlowAcrossNetwork(current) + "<br />");
%>
</body>
</html>
下面的过程演示如何在 Intranet 方案中使用 Windows 集成身份验证访问 SQL Server 数据库,而在该方案中,已分别授予每个用户访问 SQL Server 的权限。
开始时,您需要在 IIS 中将应用程序配置为禁用匿名访问并启用 Windows 身份验证。
为 Windows 集成身份验证配置 IIS
-
在 Windows 中,打开“Internet 信息服务”管理工具。
在 Microsoft Windows 2000 Server 或 Windows Server 2003 操作系统中:在 Windows“开始”菜单中,依次指向“程序”、“管理工具”和“Internet 服务管理器”。
在 Microsoft Windows XP Professional 操作系统中:打开控制面板中的“管理工具”。
打开您的服务器的节点,然后继续打开节点,直到找到您的应用程序的节点(通常在“默认网站”之下)。
右击您的应用程序,再单击“属性”。
在“目录安全性”选项卡上,单击“编辑”。
-
在“身份验证方法”对话框中,清除“匿名访问”复选框,然后执行下列操作之一:
如果 SQL Server 与 IIS 位于同一台计算机上,选中“集成 Windows 身份验证”复选框。
如果 SQL Server 是远程服务器,选中“基本身份验证”复选框,并清除“集成 Windows 身份验证”复选框。
关闭所有对话框。
在应用程序配置文件 (Web.config) 中,指定应用程序将模拟 IIS 提供的用户凭据。
将 Web.config 配置为模拟 IIS 提供的标识
-
打开应用程序的 Web.config 文件并向 system.web 元素添加以下内容:
<identity impersonate="true"/>
说明:
Web.config 中的元素区分大小写。
在创建连接字符串以访问 SQL Server 时,必须包含通知 SQL Server 您正在使用集成安全性的属性。
为 Windows 集成安全性配置连接字符串
-
在 SQL Server 的任何连接字符串中,包含属性 Trusted_Connection=Yes 并移除用户名和密码属性。
下面显示的是一个为 Windows 集成安全性配置的典型连接字符串:
"workstation id=WebServer1;packet size=4096;
Trusted_Connection=Yes;data source=SQLServer01";
persist security info=False;initial catalog=northwind"
将 SQL Server 设置为可以识别将访问它的用户。
为 Windows 集成安全性配置 SQL Server
从 Windows 的“开始”菜单中,选择“Microsoft SQL Server”,然后选择“企业管理器”。
打开服务器的节点,并展开希望将其权限授予用户的数据库的节点。
右击“用户”节点,选择“新建数据库用户”。
在“数据库用户属性”对话框中,在“登录名”框中输入域\用户名,然后单击“确定”。另外,将 SQL Server 配置为允许所有域用户访问数据库。
-------------------------------------------------------------------------------------------------------------------------------------------------
使用映射的 Windows 域用户访问 SQL Server
默认情况下,在 Microsoft Windows 2000 和 Microsoft Windows XP 中,ASP.NET 应用程序在名为 ASPNET 的本地用户帐户的上下文中运行;在 Windows Server 2003 中,该应用程序在名为 NETWORK SERVICE 的本地用户帐户的上下文中运行。这两种用户帐户具有有限的访问权限。但 ASPNET 帐户是 Web 服务器的本地帐户。 因此,在远程计算机上并不会将它识别为用户。若要避开此限制,您可以让您的应用程序在 Windows 域用户(Web 服务器和运行 Microsoft SQL Server 的计算机都可以识别)的上下文中运行。
将您的应用程序进程映射到 Windows 域用户帐户时,要求您配置下列内容:
-
Web 服务器。
必须确保您所指定的 Windows 域用户帐户具有足够(但仅此而已)的用户权限来运行 Web 应用程序。
-
应用程序。
必须配置 ASP.NET 的 Web.config 文件以识别域用户帐户名。
说明:
有关 Machine.config 和 Web.config 文件的信息,请参见 ASP.NET 配置概述。
-
连接字符串。
在为应用程序中的连接对象创建连接字符串时,必须指定这些连接字符串将使用 Windows 集成安全性。
-
SQL Server。
必须添加指定的域用户帐户作为 SQL Server 登录用户。
为 Windows 域用户帐户设置用户权限
-
在 Web 服务器上,使用 Windows 管理工具确保映射的 Windows 域用户帐户具有必需的用户权限。
有关详细信息,请参见 ASP.NET 必需的访问控制列表 (ACL)。
使用 -ga 开关运行 aspnet_regiis.exe,以授予将用于应用程序模拟的标识所需的一般用户权限。
在为域用户帐户建立正确的用户权限后,需要配置应用程序标识模拟。
安全说明:
将用户凭据放入 Web.config 文件时,可能会对安全构成威胁。对包含 Web.config 文件的目录具有访问权限的用户可以读取该文件,进而查看这些凭据。有关如何针对此威胁采取保护措施的详细信息,请参见使用受保护的配置加密配置信息。
为模拟配置 Web 应用程序
-
打开应用程序的 Web.config 文件,然后添加下面的标识模拟代码:
<identity impersonate="true" userName="domain\username" password="********"/>
请将以上示例中列出的值替换为正确的密码。
说明:
Web.config 文件中的元素区分大小写。
最后,在为数据库访问创建连接字符串之后,请将这些连接字符串配置为使用 Windows 集成安全性。
在连接字符串中使用 Windows 集成安全性
-
在为应用程序创建连接字符串时,不要包含用户名和密码。相反,对于连接字符串,应将 Integrated Security 属性设置为 SSPI。
下面的示例演示了一个包含适当属性的连接字符串:
data source=myserver;initial catalog=northwind;Integrated Security=SSPI
为集成安全性配置 SQL Server
在 Windows 中,单击“开始”,指向“Microsoft SQL Server”,然后单击“企业管理器”。
打开服务器的节点,然后展开要向其授予用户权限的数据库的节点。
右击“用户”,然后单击“新建数据库用户”。
在“数据库用户属性”对话框中,在“登录名”框中输入域\用户名,然后单击“确定”。
---------------------------------------------------------------------------------------------------------------------------------
以本地用户身份访问 SQL Server
默认情况下,当 ASP.NET 应用程序运行时,它运行在名为 ASPNET(在 Microsoft Windows 2000 和 Microsoft Windows XP 中)或 NETWORK SERVICE(在 Microsoft Windows Server 2003 中)的特殊本地用户帐户的上下文中。此用户帐户具有的用户权限足以在 Web 服务器上运行应用程序。
如果 Microsoft SQL Server 和 Web 服务器位于同一台计算机上,则可以将 ASPNET 或 NETWORK SERVICE 用户帐户定义为运行 SQL Server 的计算机上的本地用户帐户。
此方法的优点在于它是安全的,因为 Web 应用程序在有限的安全性上下文内运行。在 SQL Server 中使用单个用户名也是高效的,因为这使 SQL Server 可以利用连接池来进一步增强应用程序的可伸缩性。
将 SQL Server 用户权限授予 ASPNET 或 NETWORK SERVICE 用户帐户
在 Windows 中,单击“开始”,指向“程序”,再指向“Microsoft SQL Server”,然后单击“企业管理器”。
展开服务器的节点,然后展开您要授予用户权限的数据库的节点。
右击“用户”,然后单击“新建数据库用户”。
在“数据库用户属性”对话框中,在“登录名”框内输入计算机名称\ASPNET 或 NT AUTHORITY\NETWORK SERVICE,然后单击“确定”。
-------------------------------------------------------------------------------
使用预设的凭据访问 SQL Server
连接到 SQL Server 的可靠方法是在连接字符串中传递用户名和密码。您可以使用预设的用户名和密码。建议的方法是将预设的用户名和密码作为 connectionStrings 配置节的一部分存储在服务器中,然后使用受保护的配置来加密连接字符串内容。有关详细信息,请参见受保护配置概述。此外,建议使用 NTFS 文件系统权限来限制对 Web.config 文件的访问。
安全说明:
决不将凭据以字符串形式硬编码到您应用程序的程序中。能够访问代码文件(甚至是已编译的代码)的任何人员,都将能够获取凭据。
安全说明:
始终将资源的最少访问特权给予预设用户名。决不使用“sa”或任何其他管理级别的用户名。始终使用强密码。
将凭据存储在 Web.config 文件中
-
在 Web.config 文件的 connectionStrings 元素中创建一个新的 add 关键字。connectionStrings 元素必须作为 configuration 元素的子元素出现。有关详细信息,请参见配置节架构。
下面的示例阐释一个包含用户名和密码的 add 关键字:
<configuration>
<connectionStrings>
<add name="NorthwindConnection"
connectionString="Data Source=localhost;
Initial Catalog=Northwind;
User Id=ApplicationUserID;
Password=#P%19!ef2" />
</connectionStrings>
</configuration> 使用受保护的配置加密连接字符串值,如演练:使用受保护的配置加密配置信息中所示。
-
在您的应用程序中,从 ConfigurationManager 类的 ConnectionStrings 属性读取凭据。
下面的示例显示如何在运行时读取凭据并将它们串联到连接字符串中:
Dim settings As ConnectionStringSettings
settings = System.Configuration.ConfigurationManager.ConnectionStrings("NorthwindConnection")
Dim connectionString As String = settings.ConnectionStringConnectionStringSettings settings;
settings = System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnection"];
string connectionString = settings.ConnectionString;