2012-06-09 66 views
16

我發現很多人都遇到了這個錯誤,但是他們的情況都與我的顯示有些不同。Web應用程序獲取登錄失敗,用戶'NT AUTHORITY ANONYMOUS LOGON'

我有一個在Windows 2003 Server上運行IIS 6.0的ASP.NET 4.0 Web應用程序。

當我遠程訪問Web服務器框並登錄並以localhost而不是機器名訪問網站時,該Web應用程序正常工作。然而,當我從其他客戶機訪問該網站,我得到以下錯誤:

Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON' 

的網站上有匿名訪問打開Windows身份驗證開啓。該Web應用程序包含以下內容:

<authentication mode="Windows"> </authentication> 
    <identity impersonate="true"/> 

    <connectionStrings> 
     <add name="MyConnection" connectionString="Data Source=MyDbServer;Initial Catalog=MyDatabase;Integrated Security=True" 
</connectionStrings> 

我的Web服務器正在虛擬服務器上運行。這是相關的嗎?我不假設。

請注意,如果在Impersonation = TRUE後將我的域\登錄名和密碼添加到Web配置中,則該網站可以正常工作。

+0

聽起來真是你必須啓用匿名訪問檢查,但是所選擇的用戶沒有適當的權限。此外,您已將此標記爲Server 2008,但您在正文中說您使用的是2003. –

+0

我不這麼認爲,因爲當我以MyDomain \ MyID身份登錄到Web服務器並訪問http:// localhost/mysite,該網站的作品。當我登錄到我的PC並使用http:// webservername/mysite /訪問站點時,我得到匿名登錄的LogonFailed錯誤。但是,當我遠程訪問Web服務器並使用無法訪問數據庫的ID登錄到Web服務器時,出現無法打開登錄請求的數據庫「MyDatabase」的錯誤。登錄失敗。 用戶'MyDomain \ MyID'(非匿名)登錄失敗。此外,我可以使用SSMS和Windows身份驗證連接到數據庫。 – ChadD

+0

只是好奇,你用什麼瀏覽器來測試? – nunespascal

回答

26

這聽起來像是遇到了所謂的「雙跳」問題,即服務器不被信任將客戶端憑證傳遞到另一個框的地方(第1跳是IIS框的憑證,跳2是從IIS框到SQL Server)。

當您直接登錄到服務器時,第二跳不需要發生,因爲它只是直接從客戶端計算機(此場景中的IIS服務器)直接向SQL Server傳遞憑證。同樣,如果SQL Server位於IIS框上,也不會出現此錯誤,因爲客戶端只會向可以與IIS和SQL Server共享憑據的框發出一個請求。

需要執行相當多的步驟才能使委派工作,如信任服務器進行委派,創建SPN並確保其他適當的權限授予IIS用於運行網站的帳戶。有一個TechNet文章,可以幫助您介紹了很多需要的步驟在這裏:如果你使用 NTLM和不支持Kerberos(或其他可委託協議),它不會工作,如:http://blogs.technet.com/b/taraj/archive/2009/01/29/checklist-for-double-hop-issues-iis-and-sql-server.aspx

注中間服務器(IIS服務器)需要有一個它可以傳遞的令牌。由於NTLM基於談判,因此無效。

+1

啊!雙跳問題!非常感謝你!我忘了 – Alex

+0

很好的答案。我已經從這裏的一個更近期的問題鏈接回來了,情況不同,但症狀和根本原因是相同的:https://stackoverflow.com/questions/47871816/how-to-run-an-r -script-其中-具有數據庫連接-使用集成的 - 窗口A/47877987#47877987 –

5

這裏的問題是您正在使用

<authentication mode="Windows"> </authentication> 

這需要你的瀏覽器發送NTLM憑據。 Firefox默認不會發送這個消息。

當你在服務器上並使用本地主機時,你的瀏覽器正在將你的Windows登錄憑證發送到服務器。它正在對用戶MyDomain \ MyID進行身份驗證並授予訪問權限。

ASP.NET模擬IIS傳遞給它的令牌,它是經過身份驗證的用戶或匿名Internet用戶帳戶(IUSR_machinename)。

您的所有網絡請求都來自不在該域中的機器,這些請求將在匿名帳戶下運行。在你的情況下,NT AUTHORITY\ANONYMOUS LOGON

您的連接字符串正在使用,Integrated Security=True。這意味着asp.net線程正在處理的windows帳戶也必須有權訪問數據庫。 如果你想傳遞用於登錄到IIS的Windows憑據,你必須設置,Trusted_Connection=Yes

參見:How to: Access SQL Server Using Windows Integrated Security

我建議你看一看窗體身份驗證,如果你打算暴露在網絡上此WebService,或者如果你想讓它提供給用戶誰是不一樣的域作爲您的服務器。

+0

順便說一句,檢查你的文章的前2個句子的錯別字。 :-)注意,我應該也提到過,我遠程訪問了另一臺電腦,並使用與我的網站位於同一個域的ID登錄,並得到了同樣的錯誤。如果使用集成安全性,您確定運行ASPNET的Windows帳戶也需要訪問數據庫嗎?我認爲設置IMPERSONATION = TRUE意味着它應該模仿當前用戶。 – ChadD

+0

更正。增加了一些更多的說明。 – nunespascal

+0

我在文章中發現了一些我以前錯過的東西:如果SQL Server位於遠程服務器上,請在IIS中清除Windows身份驗證並選擇「基本」。但是當我這樣做時,系統會提示用戶輸入最初登錄到他的PC時所用的Windows LAN憑據。這很不方便,爲什麼它是必要的?此外,如果用戶輸入他的用戶代碼\ pwd,它將被不安全地發送給用戶。 – ChadD

0

我發現我的問題是,在IIS中我啓用了Windows身份驗證而不是基本身份驗證。只要我切換到基本身份驗證,我就可以在登錄帳戶下訪問SQL Server。

In IIS, only Basic Authentication logs users on with a security token that flows across the network to a remote SQL server. By default, other IIS security modes used in conjunction with the identity configuration element settings will not result in a token that can authenticate to a remote SQL Server.

來源:http://msdn.microsoft.com/en-us/library/bsz5788z.aspx

相關問題