2011-06-02 76 views
1

我部署我的web應用程序使用Visual Studio 2010中創建到遠程服務器IIS 6.0 Windows 2003上部署Web應用程序的回報 - 401未授權

當試圖瀏覽到網站,它返回默認的標題,並在頁面正文錯誤:

The Request Failed with HTTP status 401: Unauthorized

現在我以管理員身份登錄並相應地設置了權限和目錄安全性。

我試着檢查有無匿名訪問,並在兩種情況下收到相同的錯誤。

它在我的本地開發環境中運行良好,應用程序的範圍是查看它在報告加載時使用report-viewer返回的報告。

有沒有人認爲這與訪問報告服務器是不同的服務器或本地訪問生產/託管服務器上的網站?

對於託管/生產服務器,我使用的密碼不同於我的開發計算機和報告服務器,但它應包含我設置的域組中的任何人。

回答

3

幾乎可以肯定的NTFS文件系統的安全問題,則需要具有讀添加IUSR_<your machine name>ASPNET(ASP.NET計算機用戶賬號)和執行權限爲您的網站/應用程序的文件夾。

+0

不太理解。在啓用匿名訪問的身份驗證方法下,用戶名是IUSER 。你指的是什麼ASPNET帳戶? – vbNewbie 2011-06-02 18:49:44

+0

如果您訪問控制面板 - >管理工具 - >計算機管理,並在本地用戶和組 - >用戶下檢查,您應該找到這些帳戶以及有關哪些進程使用它們以及爲什麼的說明。 IIS訪問物理機器上的文件爲'IUSR _...'帳戶,而ASPNET'帳戶由ASP.NET工作線程使用(讀取/執行應用程序) – Rudu 2011-06-02 19:01:17

+0

好吧,所以我有權限讀取和執行設置爲IIS下的默認網站下的文件夾...已經和其他想法。感謝您的迴應。我是否需要爲IUSR和ASPNET用戶改變任何東西 – vbNewbie 2011-06-02 19:14:18

1

我想知道如果你允許匿名訪問,你是否指定了一個在那種情況下使用的用戶?如果是這樣,該用戶是否可以訪問Web應用程序文件的讀取/執行?如果你沒有指定用戶,你應該有一個名爲「IIS_USR」的用戶默認(我認爲這是Windows Server 2003)。您需要確保此用戶有權訪問應用程序目錄中的讀/寫內容。

+0

我想我的用戶可能是錯的,Rudu的IUSR聽起來不錯.. – Brett 2011-06-02 18:38:40

+0

我檢查和權限用戶{mymachinename \用戶}設置爲讀取和寫入等 – vbNewbie 2011-06-02 18:50:47

+0

@vbNewbie - 和'執行',正確嗎? – Brett 2011-06-02 19:01:02

0

這是一個古老的問題,但是這個錯誤昨天突然開始出現在我們的內部應用程序上,在微軟安全補丁之後。

原因是我們有一些在IIS上運行的網站,其應用池設置爲在NetworkService帳戶下運行。在昨天之前,沒問題,他們一切正常。但是在補丁之後,幾乎所有用戶都得到了「401未授權」錯誤。

有三種解決方案,以這樣的:

  • 更改網站「真正的」用戶帳戶下運行,並確保用戶確實有權在網站的IIS文件夾中讀取文件。換句話說,右鍵單擊該文件夾,選擇安全選項卡,然後爲該用戶添加權限。
  • 更改網站文件夾的權限,並確保YOURCOMPUTERNAME\Users有權訪問此文件夾。是的,這是一個真實的帳戶,我們懷疑Microsoft補丁實際上刪除了這些權限。
  • 將網站的應用池設置爲NetworkService,但是,再次確保哪個用戶將使用該網站有權讀取該網站的IIS文件夾中的文件。所以,我們有一個活動目錄組,其中包含將使用本網站的用戶,所以我們將此AD組添加到文件夾的安全選項卡,並確保他們可以訪問這些文件。

同樣,奇怪的是,我們的網站在這個補丁之前運行得很漂亮。

而且,爲了防止其他人在2017年遇到此問題,我還必須在我的函數中添加一行C#代碼以使用「UseDefaultCredentials」來調用Web服務。再次,在微軟補丁之前,這條線不存在,並且它工作正常。但在修補程序之後,我們會收到401個錯誤,直到我添加此行。

public string CallWebService(string URL) 
{ 
    HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(URL); 
    objRequest.Method = "GET"; 
    objRequest.KeepAlive = false; 
    objRequest.UseDefaultCredentials = true; 

    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); 
    string result = ""; 
    using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) 
    { 
     result = sr.ReadToEnd(); 
     sr.Close(); 
    } 
    return result; 
} 

希望這會有所幫助。