首先,您似乎正在尝试向运行该站点的帐户授予权限。在 IIS 6 和 IIS7 中,这些由应用程序池上设置的帐户控制。该帐户曾经是ASPNET
但不再是默认的。相反,默认值(我相信从 .NET 2.0 开始)是NETWORK SERVICE
. 但是,如果您使用的是 IIS 7,那么情况又发生了变化。默认情况下,在 IIS7 中,它使用称为“ApplicationPoolIdentity”的东西,这是它自己为每个站点创建的特殊凭据。如果 SQL Server 与 Web 服务器位于不同的机器上,您将遇到另一个问题,即凭据都是机器本地的。
我的建议是根据您的设置执行以下操作:
两台服务器都在一个域上,并且您想使用受信任的连接:
- 创建一个域帐户并将其放入域用户中。
- 在 Web 服务器上,将此帐户放入 IIS_IUSRS 组。
- 进入站点的应用程序池并将运行站点的帐户更改为此域帐户。您还需要确保此帐户对站点文件具有适当的 NTFS 权限。如果此站点仅写入数据库,您可以授予帐户只读访问包含站点文件的文件夹的权限。
- 确保形成站点使用的连接字符串以请求受信任的连接。(有关语法,请参见 www.connectionstrings.com)
- 在数据库服务器上执行您对该帐户的授权:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO "domain name\MyIISAccount"
还可能存在与域上的两台服务器相关的其他 Kerberos 问题,并且可能需要创建 SPN(服务主体名称)。
两台服务器都不在域上(即,两者都是成员服务器)并且您想使用受信任的连接:
- 使用相同的用户名和密码在 Web 服务器和数据库服务器上创建一个本地帐户。至关重要的是,它们都具有相同的用户名和密码。该技术涉及使用 NTLM“直通”身份验证,该身份验证与用户名和密码创建的哈希相匹配,以确定用户是否在两个不同的服务器之间进行了身份验证。在 Windows 2008 R2 上,您可能需要跳过一些本地策略来确保在两台服务器之间启用 NTLM。
- 使用此帐户执行上述步骤 #2 至 #4。
- 在 SQL Server 上,确保此本地帐户具有登录名,并且此登录名映射到数据库中的用户。然后你会执行类似的东西:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO 'SQLServerMachineName\AccountUsedBySite'
您想使用 SQL 帐户而不是受信任的连接:
- 在这种情况下,站点用于连接到数据库的连接字符串将包括用户名和密码,这些用户名和密码映射到 SQL Server 数据库上的登录名,该登录名映射到数据库中的用户(通常放在 db_owner 角色中以使其dbo)。这
- 假设凭证是正确的,您只需针对该用户执行您的授权:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO 'SQLUserAccountUsedBySite'
IIS 和 SQL Server 在同一台计算机上,并且您希望使用受信任的连接
- 创建一个本地用户帐户并将其放入用户组。
- 将此帐户放入本地 IIS_IUSRS 组。
- 进入站点的应用程序池,并将运行站点的帐户更改为此本地帐户。您还需要确保此帐户对站点文件具有适当的 NTFS 权限。如果此站点仅写入数据库,您可以授予帐户只读访问包含站点文件的文件夹的权限。
- 确保形成站点使用的连接字符串以请求受信任的连接。(有关语法,请参见 www.connectionstrings.com)
- 在 SQL Server 中,为此帐户创建一个登录名,然后在适当的数据库中为该帐户创建一个用户,将其放入适当的角色中。
- 现在执行您对该帐户的授权:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO 'SQLServerMachineName\MyIISAccount'