为什么我的MVC应用程序尝试以我的机器身份登录我的数据库,而不是作为App Pool身份?

Pro*_*ofK 11 database asp.net-mvc impersonation asp.net-mvc-4

当我尝试访问我新部署的(到lcoal IIS 7.5)MVC4应用程序时,我收到错误:

用户'DOMAIN\MACHINE-NAME $'登录失败

其中附加'$'而不是机器名称的一部分.

web.config中的连接字符串如下所示:

<add name="ComairRIEntities"
     connectionString="metadata=res://*/Data.ComairRI.csdl|res://*/Data.ComairRI.ssdl|res://*/Data.ComairRI.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

Alo*_*atz 10

这是正在发生的事情:

在您的连接字符串中,您具有以下设置:integrated security = True 这意味着SQL Server连接将使用启动连接的进程的凭据进行身份验证.由于您在IIS下运行并且IIS使用应用程序池,因此将使用运行应用程序池的Windows用户对连接进行身份验证.默认情况下,这是一个几乎没有名为NetworkService的权限的用户.NetworkService(或者在IIS7.5中它是另一个)将永远不会拥有对您的数据库的访问权限.您的特定方案的细微差别可能会有所不同,因为IIS中存在大量不同的安全继承,并且您的进程可能会结束一堆不同的用户,但是,基本问题是您已经集成了security = True和用户IIS进程正在运行,是一个几乎没有权限的标准用户.

要修复你有几个选择:

  1. 将集成安全性更改为True =用户名\密码验证.这将100%解决,但您可能不希望将密码明文存储在web.config文件中.
  2. 在IIS虚拟目录设置中,将匿名用户配置为对db具有访问权限的有意义用户.这将最终有所帮助,但您必须使用不同的设置才能使其正确.

如果您需要有关#2的更多帮助,您必须提供以下信息:

  1. AppPool的身份
  2. 虚拟目录的标识和虚拟目录的所有身份验证设置.