是的 - 你没看错!我想让我的网络应用程序不连接到本地 SQL Server Express (2008R) 数据库!
我为我的 Web 应用程序创建了一个域用户帐户,并将该用户添加到域 (AD) 组中。
在我的本地 SQL Server 实例中,我为该 AD 组创建了一个登录名。在 sql 数据库中绝对没有提到用户帐户。
然后在我的本地 IIS 中,我更改了该站点的应用程序池以使用我刚刚创建的帐户。
当我在浏览器中浏览本地站点时,瞧!它连接到数据库。
好的,所以我进入 AD 并从 AD 组中删除该用户帐户。我做一个iisreset。现在我在浏览器中浏览我的本地站点,瞧!?它连接到数据库。
嗯?它是如何连接的?通过使用[Integrated Security=SSPI][2]
,应该通过应用程序池正在使用的帐户进行身份验证。那么,既然它不属于有权访问sql数据库的组,那么它不应该失败吗?
我怎样才能让它失败?也许它正在通过其他一些 Windows 身份验证进行连接?好的,只有我的服务器实例的登录名是:
- mydomaingroup(没有我的应用程序池的用户帐户)
- 我的域管理员帐户
- 萨
- NT AUTHORITY\NETWORK SERVICE(一切都需要,甚至是 sql 日志查看器)
并且 - 我可以确认这些登录中没有一个是用户映射到我的数据库允许的用户,但特殊域组除外。
啊,更糟了。如果连接字符串使用SSPI
,那么它应该接受并使用用户名和密码(如果存在)。因此,如果我指定了我现在离开 AD 组的帐户的用户名和密码,那么应用程序池不应该尝试使用错误的凭据登录吗?——你会这么想,但是,再一次,瞧!它连接!
因此,这两个连接字符串都连接到在 sql server 实例中似乎没有凭据的域用户帐户:
<add name="development" connectionString="server=mycomputer\sqlexpress;database=shoppe;Persist Security Info=False;Integrated Security=SSPI; user id=myuser; password=mypassword; Pooling=True" providerName="System.Data.SqlClient"/>
<add name="development" connectionString="server=mycomputer\sqlexpress;database=shoppe;Persist Security Info=False;Integrated Security=SSPI; Pooling=True" providerName="System.Data.SqlClient"/>
我什至尝试添加Trusted_Connection=False;
,它仍然连接!
那么,它从哪里获得连接权限?有没有办法告诉正在使用哪个帐户进行连接?
另一方面,如果我Integrated Security=SSPI;
从连接字符串中删除,那么我根本无法使用 Windows 身份验证进行连接。我不知道这是否是一个线索。