这太奇怪了。好的,这是我的 MVC 4 项目的 web.config 中的连接字符串:
这是我的单元测试项目的 App.Config 文件中的连接字符串:
<add name="ConnectionString" connectionString="Data Source=THESERVERNAME;Initial Catalog=THETABLE;Persist Security Info=True;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
(我已将真实姓名替换为假名,仅用于此发布隐私)
我的单元测试是:
[Test]
public void GetMember_ByContractNumber_ReturnsAValidMember()
{
// Arrang
const Int64 contractNumber = 2604914977;
// Act
DTO.Member member = MemberCRUD.RetrieveMember(contractNumber);
//Assert
Assert.IsNotNull(member);
Assert.IsNotNullOrEmpty(member.FirstName);
Assert.IsTrue(member.ContractNumber > 0);
}
它通过就好了!我从数据库 CRUD 调用中得到了一个有效的成员对象。
问题:
但同时,当我尝试从 MVC 控制器进行基本相同的调用和相同的连接字符串时,我的 DL 炸弹中的相同 CRUD 方法,它在代码中的这一点上:
我得到了这个例外:
{"Login failed for user 'OURDOMAIN\\MYPCNAMEISHERE$'."} System.Data.SqlClient.SqlException
这个数据库是远程的,不在我的本地系统上。
所以显然这是权限,但我不知道如何解决这个问题。我认为我的单元测试通过的原因是因为它可能在调用数据库时使用我的 Windows 帐户作为身份,而我的 MVC 应用程序的 IIS 使用的是 AppPoolIdentity。所以不知道如何解决这个问题。在我的 web.config 中,我将身份验证设置为无,但我也尝试将其设置为 Windows 身份验证并在 IIS 中启用 Windows 身份验证......不走运。
我正在尝试运行我的设置,但到目前为止,没有任何组合可以解决此权限问题。
再次将 IIS 设置为使用 AppPoolIdentity,但我也尝试使用网络服务作为身份,并将网络服务添加为用户,并授予它对我的 SQL DB 的权限..不走运。我将尝试将 AppPoolIdentity 添加到我的 SQL Server 数据库中,但我怀疑它是否还能正常工作。不确定要尝试什么。-------------------------------- 支持图片/非常最新的设置 ------------ ------
在我的 web.config
(我在下面的 AD 帐户上拥有 dbo 权限)
更新:
这是我最近尝试过的:
1) 将以下用户添加到我的数据库的 SQL Server 安全性并赋予他们 DBO 权限:
- NT AUTHORITY\匿名登录
- 域\MYPCNAME$
- NT AUTHORITY\网络服务
2) 将以下用户添加到我的应用文件夹的文件系统安全权限中:
- 认证用户
- IUSR
- 系统
- 网络服务
- 我的广告帐户(域\我的帐户)
- IIS APPPOOL\MyAppPoolName
3)然后尝试了一些事情..当我渲染 MVC 视图时,都失败了,出现了同样的错误(登录失败):
将应用程序池标识更改为使用Local Service。然后它尝试使用 NT AUTHORITY\ANONYMOUS LOGON 连接到 SQL DB - 我得到 NT AUTHORITY\ANONYMOUS LOGON 登录失败
将池标识更改为使用Local System。它尝试使用 'DOMAINNAME\MYPCNAME$' 对 SQL 进行身份验证 - 我的 DOMAINNAME\MYPCNAME$ 登录失败
将应用程序池标识更改为使用Network Service。它尝试使用 'DOMAINNAME\MYPCNAME$' 进行连接。- 我的 DOMAINNAME\MYPCNAME$ 登录失败
将应用程序池标识更改为使用ApplicationPoolIdentity。它尝试使用 'DOMAIN\MYPCNAMEN$' 进行连接。- 我的 DOMAINNAME\MYPCNAME$ 登录失败