Asp.net-Mvc

為什麼我的 MVC 應用程序試圖作為我的機器登錄我的數據庫,而不是作為應用程序池身份?

  • November 20, 2018

當我嘗試訪問我新部署的(到 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="data source=(local);initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
    providerName="System.Data.EntityClient" />

這是正在發生的事情:

在您的連接字元串中,您有以下設置:integrated security=True 這意味著 SQL Server 連接將使用啟動連接的程序的憑據進行身份驗證。由於您在 IIS 下執行並且 IIS 使用應用程序池,因此連接將通過執行應用程序池的 Windows 使用者進行身份驗證。預設情況下,這是一個幾乎沒有權限的使用者,稱為 NetworkService。NetworkService(或者在 IIS7.5 中可能是不同的)永遠不會擁有對您的數據庫的訪問權限。您的特定場景的細微差別可能會有所不同,因為 IIS 中有一堆不同的安全繼承,並且您的程序可能最終會出現一堆不同的使用者,但是,基本問題是您有Integrated security=True並且執行 IIS 程序的使用者是幾乎沒有權限的標準使用者。

要解決此問題,您有幾個選擇:

  1. 將 Integrated security=True 更改為 username\password 身份驗證。這將 100% 解決,但您可能不想將密碼明文儲存在 web.config 文件中。
  2. 在您的 IIS 虛擬目錄設置中,將匿名使用者配置為對您的數據庫具有訪問權限的有意義的使用者。這最終會有所幫助,但您必須使用不同的設置才能正確設置。

如果您需要關於 #2 的更多幫助,您必須提供以下資訊:

  1. AppPool 的身份
  2. 虛擬目錄的身份和虛擬目錄的所有身份驗證設置。

引用自:https://stackoverflow.com/questions/14870158