尝试连接数据库时SqlClient登录失败

时间:2012-10-28 19:27:11

标签: .net asp.net-mvc sql-server-2008 ado.net enterprise-library

这太奇怪了。好的,这是我的MVC 4项目的web.config中的连接字符串:

以下是我的Unit Test Project的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数据库中,但我怀疑它会继续工作。不知道该尝试什么。 --------------------------------支持PICS /非常新的设置------------ ------

在我的web.config

(我的AD帐户下面有dbo权限) enter image description here enter image description here enter image description here

更新:

以下是我刚才尝试过的内容:

1)将以下用户添加到我的数据库的SQL Server安全性并为他们提供了DBO权限:

  • NT AUTHORITY \ ANONYMOUS LOGON
  • DOMAIN \ MYPCNAME $
  • NT AUTHORITY \ NETWORK SERVICE

2)将以下用户添加到我的app文件夹的文件系统安全权限中:

  • 经过身份验证的用户
  • IUSR
  • SYSTEM
  • 网络服务
  • 我的广告帐户(域名\ MYACCOUNT)
  • IIS APPPOOL \ MyAppPoolName

3)然后尝试了一些事情......当我渲染MVC视图时,所有失败并出现相同的错误(登录失败):

更改了应用池标识以使用本地服务。然后它尝试使用NT AUTHORITY \ ANONYMOUS LOGON连接到SQL DB - 我为NT AUTHORITY \ ANONYMOUS LOGON登录失败

更改了池身份以使用本地系统。它试图使用'DOMAINNAME \ MYPCNAME $'验证到SQL - 我的DOMAINNAME \ MYPCNAME $

登录失败

更改了应用池标识以使用网络服务。它尝试使用'DOMAINNAME \ MYPCNAME $'进行连接。 - 我的DOMAINNAME \ MYPCNAME $

登录失败

更改了应用池标识以使用 ApplicationPoolIdentity 。它试图使用'DOMAIN \ MYPCNAMEN $'进行连接。 - 我的DOMAINNAME \ MYPCNAME $

登录失败

enter image description here

1 个答案:

答案 0 :(得分:1)

您有几个选择:

  • 将您的应用程序池运行的帐户更改为(域)服务帐户,为此“用户”授予对数据库的适当权限,并在进行更改后运行iisreset / noforce。
  • 在连接到数据库之前在代码中使用模拟(例如http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User)。
  • 授予您的计算机帐户访问数据库的权限(即您在异常消息中看到的帐户可以作为数据库用户添加)。