共用方式為


針對 ASP.NET 中的常見許可權和安全性相關問題進行疑難解答

本文介紹如何針對 ASP.NET 中的常見許可權和安全性相關問題進行疑難解答。

原始產品版本: ASP.NET
原始 KB 編號: 910449

有用的工具

在您嘗試修正任何中斷專案之前,您需要熟悉一些工具,以協助您縮小問題範圍。 在我們的案例中,我們會對 FileMon、RegMon 和安全性稽核等工具感興趣。 如需 FileMon 的詳細資訊,請參閱 Windows v7.04 的 FileMon。

如需 RegMon 的詳細資訊,請參閱 Windows Sysinternals

向下切入以找出問題

  • 應用程式是否曾經運作過? 如果是,那麼可能會讓應用程式中斷的變更為何? 有可能在伺服器上套用軟體更新或安全性更新。 程式代碼推出也可能造成問題。
  • 從 IIS 提供簡單的.html和.asp頁面嗎?
  • 應用程式是否已移轉至不同版本的 IIS?
  • 伺服器上的其他 ASP.NET 應用程式是否失敗,並發生相同的錯誤? 這是唯一失敗的應用程式嗎?
  • 此問題是否針對所有使用者或僅針對特定用戶發生?
  • 在本機環境中使用網頁伺服器進行瀏覽時,問題是否可重現,還是只有少數用戶端會出現此問題?
  • 如果您使用模擬,則模擬使用者是否具有資源的必要存取權?

上述問題有助於診斷問題。 如果您要在任何 ASP.NET 論壇上發表您的問題,而您已經擁有大多數相關問題的答案,那麼很可能會快速獲得指點或問題的解決方案。 關鍵是張貼整個 ASP.NET 堆疊追蹤錯誤,如果適用,而不是說「我在嘗試執行我的 ASP.NET 應用程式時收到拒絕存取錯誤。 任何人都可以幫忙嗎?當有人可以看到完整的錯誤訊息時,可以更輕鬆地查看堆疊追蹤,併為您提供指標。 所以你需要問自己...

確切錯誤訊息為何?

我們詢問客戶的第一個問題是:「確切的錯誤訊息是什麼?如果您有Microsoft .NET Framework 擲回的錯誤訊息清楚描述,您可以略過本節。 如果您的應用程式隱藏了實際的錯誤訊息,而改為提供一個友善的錯誤訊息供您參考,例如「發生未預期的錯誤。」 請連絡網站管理員以取得詳情,對任何人來說都沒有什麼用處。 以下是幾個步驟,可協助您取得實際的錯誤訊息。

  • 找出並開啟應用程式目錄中的 Web.config 檔案,並將 customErrors 變更為 mode=“Off”。 儲存檔案,並重現問題。

  • 由於應用程式開發人員所完成的自定義事件/錯誤處理,在遵循上述步驟之後,仍可能無法看到實際的錯誤訊息。 您可以嘗試在 Global.asax 檔案中找出Application_Error事件,並將任何使用 Server.Transfer("Errors.aspx") 函式的程式代碼批注至自定義錯誤頁面。

    //Global.asax 
    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs 
        //Server.Transfer("Errors.aspx"); 
    }
    

一旦您收到實際的錯誤訊息,請閱讀它以判斷錯誤是由本機資源遺失的許可權或 ASP.NET 應用程式嘗試存取的遠端資源所造成。

提示

您可以連絡開發人員,瞭解如何查看實際的錯誤訊息。 您的開發人員可能會將記錄存入檔案或收到電子郵件通知。 請務必記得備份您要變更的任何檔案。 有了可用的備份,您隨時都可以回復任何變更。

發生問題的原因是 ASP.NET 應用程式嘗試存取之本機資源的許可權遺失

如果您因為自定義錯誤訊息而無法取得問題的清楚描述,請執行 FileMon 並重現問題。 停止並儲存擷取為FileMon.xls,並在 Microsoft Excel 中開啟檔案。 在 [ 數據] 功能表上,選取 [ 篩選],然後選取 [ 自動篩選] 以使用Excel的篩選功能。 現在選取資料行 F 中的下拉式清單,並尋找「拒絕存取」錯誤。

範例 FileMon 輸出如下所示。

10381 1:01:11 PM w3wp.exe:2320 OPEN C:\winnt\microsoft.net\framework\v1.1.4322\Temporary ASP.NET Files\sessiontest\8832e585\275ec327\global.asax.xml 
ACCESS DENIED NT 
AUTHORITY\NETWORK SERVICE

如您所見,從篩選的結果中,我們已縮小問題的原因。 FileMon 顯示 NT AUTHORITY\NETWORK SERVICE 帳戶在資料夾 C:\Winnt\Microsoft.net\Framework\v1.1.4322\Temporary ASP.NET Files 缺少 NTFS 許可權。 這應該很簡單修正。

提示

將 ASP.NET 程式帳戶變更為系統管理員帳戶,以查看其是否修正問題,是一個很好的步驟。 在 IIS 6.0 和更新版本中,您會將 IIS AppPool 身分識別變更為「本機系統」,以查看應用程式是否正常運作。

注意

這不應該當做解決方案使用,而只能做為疑難解答步驟。

大多數人可能會傾向於重新安裝 Microsoft .NET Framework,甚至會做到重新安裝操作系統的程度。 這不是建議的疑難解答步驟,也不保證問題不會重新發生。 我會提供一個這樣的範例。 間歇性問題通常很難辨識和排除故障。 在此案例中,客戶的應用程式會正常運作數小時,然後突然失敗,並出現下列錯誤。 客戶已嘗試重新安裝 .NET Framework 和作系統。 這似乎修正了幾天的問題,但隨後又重新出現。

執行 FileMon 未顯示任何 拒絕存取 的錯誤。 ASPNET 帳戶的所有必要許可權都已就緒。 從問題中復原的唯一方法是重新啟動機器。 即使 IIS 重設也無濟於事。 您認為「啊,Microsoft軟體一律需要重新啟動才能復原?嗯,你錯了!

重點是仔細查看錯誤訊息。 錯誤清楚地指出「無法開啟檔案以供寫入」,而不是一般的 ACCESS DENIED 錯誤,因此我認為這是一些其他程式,在檔案或資料夾上保留鎖定,不允許 ASP.NET 寫入檔案。 重新啟動會終止其他進程,而 ASP.NET 應用程式會再次開始運作,直到流氓進程再次鎖定檔案為止。 要執行的邏輯動作是關閉伺服器上執行的所有防病毒軟體、第三方間諜軟體或任何其他檔案監視軟體。 我不想指出任何特定的第三方軟體。 但是,一般而言,防病毒軟體已知會對 IIS 和 ASP.NET 應用程式造成許多困擾。 防病毒軟體所造成的另一個已知問題,是當接觸 Bin 資料夾或 .config 檔案時,AppDomain 回收而導致會話遺失。

提示

關閉第三方服務最簡單的方式是:

  1. 選取 [開始],選取 [ 執行],然後輸入 msconfig
  2. 選取 [服務 ],然後核取 [隱藏所有Microsoft服務]。
  3. 選取 [全部停用 ] 以停止第三方服務。
  4. 選取 [開始],選取 [執行],然後輸入 iisreset 以重新載入工作進程中的 CLR。

監視您的應用程式,以查看問題是否再次發生。 如果您執行多個防毒程式,請使用試用版和錯誤方法來判斷造成問題的特定程式。

注意

如果相同的錯誤可重現 100% 的時間,您的防病毒軟體可能不是原因。 此錯誤可能有其他原因。 請嘗試建立一個簡單的 ASP.NET 測試應用程式,來檢驗 Test.aspx 頁面是否會發生相同的錯誤。 如果是,請確認 ASP.NET 的必要 存取控制 清單 (ACL) 都已就緒。

請參閱 ASP.NET 必要 存取控制 清單 (ACL)

提示

資料夾 %SystemRoot%\Assembly 是全域程式集緩存。 您無法直接使用 Windows 檔案總管編輯此資料夾的 ACL。

請改用命令提示字元並執行下列命令:

cacls %windir%\assembly /e /t /p domain\useraccount:r

或者,在使用 Windows 檔案總管之前,請使用下列命令取消註冊Shfusion.dll,以透過 GUI 授與許可權:

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32-u shfusion.dll

使用 Windows 檔案總管設定權限之後,請使用下列命令重新註冊Shfusion.dll:

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32 shfusion.dll

發生問題的原因是 ASP.NET 應用程式嘗試存取遠端資源的許可權遺失

當您的 ASP.NET 應用程式存取遠端資源時,例如 Microsoft SQL Server 或通用命名約定 (UNC) 共用,可能會發生許多問題。 此外,在遠端資源上設定許多專案可能不正確。 您必須針對這些問題進行疑難解答,才能讓資源運作。

您的第一個步驟是查看您是否可以透過 Windows 檔案總管連線到遠端伺服器。

  1. 在遠端伺服器上,建立名為Test的資料夾。 在 [測試] 資料夾的 [ 共用安全性 ] 索引標籤上,新增您的網域/帳戶,以及 ASP.NET 應用程式所使用的進程帳戶,並給予兩者完全控制。

  2. 在 IIS 伺服器上,使用您的網域/帳戶登入,選取 [ 啟動],選取 [ 執行],然後輸入遠端伺服器的 UNC 共用路徑: \\RemoteServerName*\Test

    如果您無法連線到此資料夾,請連絡您的網路管理員以修正此問題。 只有這樣,您的 ASP.NET 應用程式才能存取共用。

  3. 使用下列程式代碼建立名為 CreateUNCFile.aspx 的 檔案,並將檔案儲存在應用程式目錄中。

    <%@ Page Language="vb" %>
    <%@ Import Namespace="System.IO" %>
    <html>
    <head>
    <title>Writing to a Text File</title>
    <script runat="server">
        Sub WriteToFile(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim fp As StreamWriter
                fp = File.CreateText("\\<RemoteServerName>\Test\" & "test.txt")
                fp.WriteLine(txtMyFile.Text)
                lblStatus.Text = "The File Successfully created! Your ASP.NET process is able to access this remote share"
                fp.Close()
        End Sub
    </script>
    
    </head>
    <body style="font: 10pt verdana">
                <h3 align="center">Creating a Text File in ASP.NET</h3>
        <form id="Form1" method="post" runat="server">
                            Type your text:
                            <asp:TextBox ID="txtMyFile" TextMode="MultiLine" Rows="10" Columns="60" Runat="server" /><br>
                            <asp:button ID="btnSubmit" Text="Create File" OnClick="WriteToFile" Runat="server" />
                            <asp:Label ID="lblStatus" Font-Bold="True" ForeColor="#ff0000" Runat="server" />
        </form>
    </body>
    </html> 
    
  4. 請確定您在下列程式代碼行中修改 <RemoteServerName>

    fp = File.CreateText("\\<RemoteServerName>\Test\" &"test.txt")
    

    如此一來,它就會顯示您的遠端伺服器名稱。

  5. 開啟 Windows Internet Explorer,然後從 IIS 伺服器以外的用戶端電腦瀏覽至 http://**IISServerName**/**AppName**/CreateUNCFile.aspx

  6. 如果Test.txt檔案成功建立,則 ASP.NET 應用程式可以向遠端資源進行驗證。

  7. 如果從 Internet Explorer 用戶端瀏覽器無法建立檔案,但如果您從 IIS 伺服器本身瀏覽至相同的頁面,則可能是遇到了「雙重跳躍」情況。 如果您使用自定義建置的網頁元件來存取需要使用者驗證和授權的遠端資源,您可能會遇到「雙躍點」問題。 若要存取您的遠端資源,您可能需要提供使用者的認證給資源,讓資源的輸出受限於使用者有權存取的數據。

上述步驟假設您已在 IIS 中開啟 NTLM 驗證。 基本身份驗證不會使用 Kerberos。

如需詳細資訊,請參閱 Internet Explorer 中 Kerberos 失敗的疑難排解

如需 IIS 驗證方法的詳細資訊,請參閱 Visual Studio 2003 已淘汰的技術檔

提示

如果您可以連線到遠端 UNC 共用,但無法從 ASP.NET 應用程式連線到執行 SQL Server 的遠端伺服器,則您可能必須檢查或設定 SQL Server 的服務主體名稱(SPN)。 請嘗試在 IIS 中只為您的應用程式啟用基本身份驗證,並查看您是否能夠連線到執行 SQL Server 的遠端伺服器。

「伺服器應用程式無法使用」錯誤訊息還有其他許多原因。 事件記錄檔是您最好的選擇,可取得問題原因的詳細數據。

IIS 記錄適用於 IIS 驗證相關錯誤的情況。

您需要尋找的是這個特定錯誤的狀態和子狀態代碼。

2006-10-12 22:47:28 W3SVC1 65.52.18.230 GET /MyAPP/login.aspx - 80  
MyDomain\UserID_91 65.52.22.58 Mozilla/4.0+  
(compatible;+MSIE+6.0;+Windows+NT+5.2;+SV1;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1) 401 3 5

我們看到具有子狀態 3 的 401,表示「資源上因 ACL 而未經授權」。

這表示檔案或資料夾缺少NTFS許可權。 即使您嘗試存取的檔案許可權正確,也可能會發生此錯誤,但其他SYSTEM和 IIS 資料夾中可能會遺漏預設許可權和用戶權力。 例如,如果IUSR_ComputerName帳戶無法存取 C:\Winnt\System32\Inetsrv 目錄,您可能會看到此錯誤。

提示

選取 [開始],選取 [ 執行],然後輸入logfiles 以開啟包含 IIS 記錄的資料夾。 或者,在 IIS 中網站的屬性頁面上,選取 [WebSiteName ] 索引卷標,然後在 [ 使用中記錄格式] 底下,選取 [ 屬性 ] 以查看記錄檔目錄和名稱。

在這裡另一個有趣的點是狀態代碼 5。 您可以使用 net helpmsg 命令來取得此狀態代碼的詳細資訊:

C:\Documents and Settings\User> net helpmsg 5

存取遭拒。

讓我們嘗試另一個常見的狀態碼,狀態碼 50:

C:\Documents and Settings\User> net helpmsg 50

不支援該請求。

提示

每當您收到另一個臭名昭著的「500 內部伺服器錯誤」訊息時,最好停用友好的 HTTP 錯誤訊息顯示,以便您收到錯誤的詳細描述。 別忘了查看事件查看器,因為它也可能包含詳細資訊。

其概念是使用所有記錄的資訊,以取得手邊問題的最大詳細數據。

資源

如需詳細資訊,請參閱