ASP.Net Web 應用程序嘗試使用模擬和委託連接到 SQL Server
我正在嘗試在 Intranet ASP.Net Web 應用程序中使用模擬和委派,以便將經過身份驗證的使用者憑據傳遞到 SQL Server。
Web 伺服器和 SQL 伺服器是兩台獨立的機器,但在同一個域中,因此需要委託。
我做了以下事情:
- 設置
<authentication mode="Windows"/>並<identity impersonate="true"/>在我的網路應用程序的 web.config 中。- 啟用了從 Web 伺服器到 Active Directory 中 SQL Server 上的 MSSQLSvc 服務的約束委派。
- 通過 IIS 在網站中僅啟用 Windows 身份驗證。
顯然這應該都可以工作,但它沒有(SQL Server 拒絕訪問匿名使用者 - “使用者’NT AUTHORITY\ANONYMOUS LOGON’ 登錄失敗”)。
在 IIS7 中,應用程序池設置為使用集成管道模式並使用 NetworkService 標識執行。該網站僅啟用了 Windows 身份驗證,擴展保護已關閉,核心模式身份驗證已啟用,並且 NTLM 是提供者。
我讀過的所有網頁似乎都表明我的設置應該可以工作。我錯過了什麼?
我發現了答案:
IIS7 中的 Windows 身份驗證提供程序必須設置為Negotiate:Kerberos,而不是 NTLM。這意味著必須禁用核心模式身份驗證設置。這似乎很好。我認為在使用自定義身份(即一個特定身份)時需要核心模式身份驗證是正確的。委託可以使用任意數量的身份。所以一切都很好。
我也寫了一篇關於這個的部落格文章,其中更詳細一點。
不 - 說您需要 Kerberos(一個 SPN)來信任伺服器進行委派是不准確的,這是唯一的方法。是的,這是一種方法(您確實需要通過 Kerberos 實現它),但它不是唯一的方法,甚至在技術上也是最安全或最簡單的方法。您是否真的需要進行額外的配置並為每個 Web 使用者在 SQL 中創建一個登錄到您的數據庫的登錄名?如果其中任何一個帳戶遭到入侵怎麼辦?更多帳戶,更多漏洞。
不,而是創建一個域服務帳戶,然後讓該帳戶訪問 SQL。如果您的安全人員鎖定了某些東西,請授予該使用者以下權限:作為服務登錄、作為批處理作業登錄和允許本地登錄。或者,如果這只是為了開發和測試理論,或者您不關心或找不到設置或稍後仍然出現錯誤,這可能不會得到大量關注,但給它本地管理員(有時你必須做你必須做的事情——一些安全專家將事情鎖定得比我想寫的更嚴格——以後總是可以解決安全問題以將其鎖定)。然後將該帳戶設置為應用程序池上的自定義帳戶,並在 SQL 中為該帳戶提供登錄名。只在那個數據庫上給它 dbo。
在 IIS 中的網站上,將身份驗證類型設置為 Windows。我在其他部落格中看到他們說“基本”,因此 Kerberos 可以工作,但 NTLM 使用 Windows 身份驗證。在 IIS 7 中,您可能還希望啟用 ASP .NET 模擬。就個人而言,我只在 IIS 6 上嘗試過,但原理是一樣的。
在 web.config 中,將其添加到下面
<configuration>,這是一個“對等體”<system.web>:<connectionStrings> <add name="NorthwindConnectionString" connectionString="Data Source=serverName;Initial Catalog=Northwind;Integrated Security=SSPI;User ID=userName;Password=password" providerName="System.Data.SqlClient" /> </connectionStrings>並在
<system.web>:<authentication mode="Windows"/> <identity impersonate="true" userName="domain\user" password="password" />然後像這樣將字元串讀入您的應用程序:
using System.Configuration; string connString = String.Empty; if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0) { connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; if (connString != null) // do DB connection stuff here Console.WriteLine("Northwind connection string = \"{0}\"", connString.ConnectionString); else Console.WriteLine("No Northwind connection string"); }請參閱<http://msdn.microsoft.com/en-us/library/ms178411.aspx>。
如果在 web.config 中為 impersonate 標記和 SQL 連接填寫該帳戶後它不會與服務帳戶連接,則可以使用 WindowsImpersonationContext ( http://msdn.microsoft.com/en-us ) 使用模擬方法/library/system.security.principal.windowsimpersonationcontext.aspx)。具體來說,您需要 wic.Impersonate() 和 wic.Undo() 在獲得它們的令牌後。您可以從 web.config 中以 AppKeys 的形式讀取服務帳戶域、名稱和密碼。
簡而言之,有一些方法可以解決這些問題。您甚至可以在 web.config 中加密密碼 - 無論是在 ConnectionString 中,如果您想將其儲存在 AppKey 中而不是直接在“模擬”標籤中,如果您不想在其中使用純文字密碼(其中我建議反對),因此如果您需要使用模擬方法(就像我一樣),您可以使用它來創建登錄令牌。