2012-12-04 56 views
11

我有一個ASP.NET 4.0應用程序,我需要將身份驗證轉發到數據庫。 爲了達到此協助請求的目的,請調用Web服務器「app1」和數據庫服務器「sql1」。ASP.NET 4.0和SQL2008R2中的Kerberos雙跳

SQL2008R2數據庫服務作爲自定義域帳戶「SqlServer」下的命名實例「SQL2008R2」運行。該服務器正在運行Windows Server 2008 R2企業版。 我已經創建了一個SPN這個...

setspn -a MSSQLSvc/sql1.mydomain.local:SQL2008R2 SqlServer 

在ASP.NET應用程序中使用自定義的域帳戶「WebApplicationUser」,在綜合管線模式下的應用程序池中運行。它目前運行在運行Windows 7 Enterprise的筆記本電腦上,但最終將託管在Windows Server 2008 R2標準版上。 我已創建2分SPN的爲應用程序(即我目前從運行Windows 7的計算機上)...

setspn -a http/app1 WebApplicationUser 
setspn -a http/app1.mydomain.local WebApplicationUser 

在Active Directory用戶和計算機中,我選擇了「WebApplicationUser」賬戶,我有啓用約束委派到「MSSQLSvc/sql1.mydomain.local:SQL2008R2」使用任何協議(我也嘗試使用Kerbero只)。

應用程序在IIS 7.5中設置,並且在啓用「ASP.NET模擬」和「Windows」時將身份驗證設置爲禁用Anonymouse,Basic,Digest和Forms。 Windows身份驗證已關閉「擴展保護」並啓用了「內核模式身份驗證」。提供商是按照「協商」和「NTLM」的順序。

的ASP.NET應用程序使用EF和連接字符串被配置爲使用集成安全...

<connectionStrings> 
    <add name="MyContext" 
      connectionString="metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True&quot;" 
      providerName="System.Data.EntityClient" /> 
</connectionStrings> 

我的web配置指定Windows身份驗證和模擬,因爲我一個使用異步頁面,我有流動也使inpersonation政策...

<runtime> 
    <alwaysFlowImpersonationPolicy enabled="true" /> 
</runtime> 

<system.web> 
    <authentication mode="Windows" /> 
    <identity impersonate="true" /> 
</system.web> 

如果我在本地登錄(在爲「web1」)和瀏覽應用程序(使用IE),這一切工作 - 但這不涉及雙重一跳我正在努力解決。

如果我登錄到另一臺機器,然後使用IE瀏覽到應用程序,或者我使用FireFox從本地機器瀏覽,這不起作用 - 注意:FireFox會提示我輸入登錄信息。與數據庫的連接失敗,「登錄失敗的用戶'NT AUTHORITY \ ANONYMOUS LOGON'」

與許多文章(這裏可能是問題的一部分)不同,我沒有使用任何自定義代碼來模仿用戶。我的理解是,模擬將通過上面的web.config設置應用於應用程序。我所做的只是打開連接,然後在完成時再關閉它。

我明顯錯過了一個步驟(或兩個步驟),但查看了所有我能找到的文檔(並且已經有很多),但仍然無法找到該步驟。我能找到的99%的文檔實際上與IIS6和Windows 2003相關,但這些原則應該保持不變。

是否有人在獲得這樣的配置以在Windows 7和/或Windows Server 2008上工作?

+0

在Web和數據庫服務器上啓用Kerberos事件日誌記錄:http://support.microsoft.com/kb/262177?wa=wsignin1.0 事件查看器是查找和修復kerberos錯誤的關鍵。 – brian

+0

我已啓用此功能,並且還下載了網絡監視器工具,但我仍然無法看到足夠的信息來告訴我什麼是錯誤的。我想我沒有正確地閱讀,因爲我毫不懷疑答案就在那裏。 –

回答

7
+0

我已經看到了其中的一些,現在嘗試了其他人的建議。唉,我仍然無法得到這個工作。 –

+3

IIS7中的Windows身份驗證提供程序必須設置爲Negotiate:Kerberos,而不是NTLM。這意味着必須禁用內核模式身份驗證設置。 http://blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation/ – Joe

+2

Joe;你是對的 - 這是在我發現的任何其他文檔中沒有顯示的「Negotiate:Kerberos」 - 可能是因爲AFAIK是IIS7 +的新增功能,而所有文檔都是針對IIS6的。 –

6

當您配置的SPN爲SQL Server,我們有發現我們需要包含SQL Server l的PORT istens(1433)。

您應該下載並使用Brian Booth的DelegConfig v2工具來幫助您設置正確的配置設置。 http://blogs.iis.net/brian-murphy-booth/archive/2009/04/22/delegconfig-v2-beta.aspx

它將基本上保持你的手在整個過程中。我們發現該工具是無價的。

+0

我已經下載了該工具。雖然它非常好,但它告訴我配置是正確的,但是當我嘗試訪問數據庫中的表時,我得到相同的登錄失敗消息。 –

+1

我的建議是用端口1433替換SQL2008R2。 'setspn -a MSSQLSvc/sql1.mydomain.local:1433 SqlServer' –

+0

John,你對SPN也是正確的;我已經命名實例SPN的,但只要我刪除它們併爲host.fqdn:1433創建一個單一的SPN,這有所幫助。 –