2015-10-12 39 views
3

我正在製作一個.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服務器。

我希望有人能看到我做錯了什麼。我真的需要一個正確的方向。

+0

我們有一個通過Windows Server 12運行IIS 8.x的Web服務器,我們的DC位於Server 2008 R2上。此外,我們的Intranet網絡應用程序可通過http://appname.domain2.com訪問(而我們的域名實際上是domain1)。因此,該設置與本文中提到的設置不太一樣。以下是我們採取的其他步驟讓委派工作: –

+0

需要將appname.domain2.com添加到Intranet區域,並且需要爲Web服務器計算機設置appname.domain2.com的HTTP和HOST SPN。 此外,在AD中,我們允許Web服務器機器專門爲MSSQLSvc委派,而MSSQLSvc通過運行SQL Server的服務帳戶訪問。最後,上面爲web.config列出的部分未被使用,儘管我們通過Web服務器上的IIS管理創建了相同的配置。 –

回答

0

您應該能夠在IIS中將身份驗證設置爲ASP.NET模擬。您可能還需要在web.config文件中設置以下內容,作爲< system.web>部分的一部分。

<identity impersonate="true" /> 

這可能在< system.webServer>部分是必須的,但並不總是出於安全考慮,建議。

<validation validateIntegratedModeConfiguration="false" /> 
+0

我在我的web.config中有,對不起,我忘了在我的第一篇文章中加入。 我不認爲我需要,因爲我在經典模式下運行網站。據我瞭解,我只需要這個,如果我在集成模式下運行?我應該這樣做嗎? –

+0

爲了使用pass-thru身份驗證,您將需要模擬和Windows身份驗證。有一個安全功能不允許pass-thru,除非您關閉上面的驗證。搜索pass-thru認證,你會發現類似的答案。 – Nope

+0

感謝您的評論。我嘗試添加,但不幸的是,它提供了完全相同的結果,無論是以集成模式還是經典模式運行應用程序池。 –

2

以供將來參考,如果有人跑進了同樣的問題: 的問題是,我們從Chrome嘗試。它適用於IE瀏覽器,但在Chrome瀏覽器中,需要在此帖子中提到的註冊表更改:Kerberos delegation doesn't work in chrome

+0

在Firefox上,在此提及委派所需的更改帖子:https://developer.mozilla.org/en-US/docs/Mozill/Integrated_authentication –