我正在製作一個.NET Web API,通過調用SQL服務器來獲取數據。用戶通過Windows身份驗證(Kerberos)進行身份驗證。我想通過委託將用戶憑據傳遞給SQL服務器,但SQL服務器會看到一個匿名用戶。Asp.net代表
這是我做了什麼:
IIS應用程序: Windows身份驗證和asp.net模擬啓用。匿名和表單身份驗證已禁用。 選中內核模式認證。 提供者:協商,Kerberos。 使用應用程序池憑證:True。
應用程序池: 管理管道模式:經典。 身份:網絡服務。
在AD中,在Web服務器上運行的計算機設置爲「信任此計算機來委派任何特定的服務(僅Kerberos)」
的連接字符串到SQL服務器包含集成安全性= SSPI ;
編輯:在我的web.config我有
<system.web> <authentication mode="Windows" /> <identity impersonate="true" /> </system.web>
和
<security> <authentication> <windowsAuthentication enabled="true"> <providers> <clear /> <add value="Negotiate" /> <add value="Kerberos" /> </providers> <extendedProtection tokenChecking="None" /> </windowsAuthentication> <anonymousAuthentication enabled="false" /> </authentication> </security>
- 的通用主機spn爲機器設置。
在瀏覽器中,我通過http://machinename.domain.net訪問Web應用程序。
我希望在這個設置中我的IIS應用程序在機器帳戶下運行?我可以看到WindowsIdentity.GetCurrent()。Name是瀏覽Web應用程序的用戶和WindowsIdentity.GetCurrent()的帳戶。AuthenticationType設置爲「 Kerberos的」。所以這應該是好的。
但是WindowsIdentity.GetCurrent()。ImpersonationLevel僅被設置爲「Impersonate」。我會期望它被設置爲「委託」?
當我向SQL服務器發出請求時,我得到「用戶登錄失敗'NT AUTHORITY \ ANONYMOUS LOGON'」,所以顯然用戶憑證不會傳遞給SQL服務器。
我希望有人能看到我做錯了什麼。我真的需要一個正確的方向。
我們有一個通過Windows Server 12運行IIS 8.x的Web服務器,我們的DC位於Server 2008 R2上。此外,我們的Intranet網絡應用程序可通過http://appname.domain2.com訪問(而我們的域名實際上是domain1)。因此,該設置與本文中提到的設置不太一樣。以下是我們採取的其他步驟讓委派工作: –
需要將appname.domain2.com添加到Intranet區域,並且需要爲Web服務器計算機設置appname.domain2.com的HTTP和HOST SPN。 此外,在AD中,我們允許Web服務器機器專門爲MSSQLSvc委派,而MSSQLSvc通過運行SQL Server的服務帳戶訪問。最後,上面爲web.config列出的部分未被使用,儘管我們通過Web服務器上的IIS管理創建了相同的配置。 –