1. 程式人生 > >[BUG]ASP.NET 未被授權訪問所請求的資源。請考慮授予 ASP.NET 請求標識訪問此資源的許可權

[BUG]ASP.NET 未被授權訪問所請求的資源。請考慮授予 ASP.NET 請求標識訪問此資源的許可權

“/”應用程式中的伺服器錯誤。
--------------------------------------------------------------------------------

對路徑“//10.6.27.8/rec/rec/20100719/170007.voc”的訪問被拒絕。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊跟蹤資訊,以瞭解有關該錯誤以及程式碼中導致錯誤的出處的詳細資訊。

異常詳細資訊: System.UnauthorizedAccessException: 對路徑“//10.6.27.8/rec/rec/20100719/170007.voc”的訪問被拒絕。

ASP.NET 未被授權訪問所請求的資源。請考慮授予 ASP.NET 請求標識訪問此資源的許可權。ASP.NET 有一個在應用程式沒有模擬時使用的基程序標識(通常,在 IIS 5 上為 {MACHINE}/ASPNET,在 IIS 6 上為網路服務)。如果應用程式正在通過 <identity impersonate="true"/> 模擬,則標識將為匿名使用者(通常為 IUSR_MACHINENAME)或經過身份驗證的請求使用者。

要將 ASP.NET 訪問許可權授予某個檔案,請在資源管理器中右擊該檔案,選擇“屬性”,然後選擇“安全”選項卡。單擊“新增”新增適當的使用者或組。突出顯示 ASP.NET 帳戶,選中所需訪問許可權對應的框。

源錯誤:


行 120:            return;
行 121:        }
行 122:        File.Copy(pathSource, pathTo_voc);
行 123:        int result=DjVocConvert.PcmtoWave(pathTo_voc, pathTo_wav);
行 124:        if (result > 0)
 

原始檔: c:/inetpub/wwwroot/qc/RecPlay/RecPlay.aspx.cs    行: 122

堆疊跟蹤:


[UnauthorizedAccessException: 對路徑“//10.6.27.8/rec/rec/20100719/170007.voc”的訪問被拒絕。]
   System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +7714255
   System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite) +7628060
   System.IO.File.Copy(String sourceFileName, String destFileName) +6
   RecPlay_RecPlay.Do(String pathSource, String agentID) in c:/inetpub/wwwroot/qc/RecPlay/RecPlay.aspx.cs:122
   RecPlay_RecPlay.BuildWav(String serviceID) in c:/inetpub/wwwroot/qc/RecPlay/RecPlay.aspx.cs:94
   RecPlay_RecPlay.Page_Load(Object sender, EventArgs e) in c:/inetpub/wwwroot/qc/RecPlay/RecPlay.aspx.cs:45
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +50
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


--------------------------------------------------------------------------------
版本資訊: Microsoft .NET Framework 版本:2.0.50727.3074; ASP.NET 版本:2.0.50727.3074

///////////------------------------------以上是在Windows Server 2008 IIS 7.0

解決方案:(1)給資料夾加IUSR_MACHINENAME使用者,且賦予完全控制權:失敗

             (2)給資料夾加Net_service使用者,且賦予完全控制權:失敗

             (3)給資料夾加everyOne使用者,且賦予完全控制權:失敗

              (4)web.config "<system.web>節新增

                       <identity impersonate="false" userName="" password="" />

                   ",:OK,搞定!

     MSDN參考:

要加密使用者名稱和密碼並將它們儲存在登錄檔中,請按如下方式設定 userNamepassword 屬性。

複製
userName="registry:HKLM/Software/AspNetProcess,Name"password="registry:HKLM/Software/AspNetProcess,Pwd"

字串中位於關鍵字 registry 之後和逗號之前的部分表示 ASP.NET 開啟的登錄檔項的名稱。逗號之後的部分包含一個字串值的名稱,ASP.NET 將從此名稱中讀取憑據。必須有逗號,並且憑據必須儲存在 HKLM 配置單元中。如果配置格式不正確,則 ASP.NET 不會啟動輔助程序,然後將顯示造成當前帳戶建立失敗的程式碼路徑。

憑據必須為 REG_BINARY 格式,並且包含 Windows API 函式 CryptProtectData 呼叫的輸出。可以用 Aspnet_setreg.exe 來建立加密憑據,並將它們儲存在登錄檔中。該程式使用 CryptProtectData 來完成加密。若要下載 Aspnet_setreg.exe 以及 Microsoft Visual C++ 原始碼和文件,請轉到 ASP.NET 網站並搜尋 aspnet_setreg。

應該對儲存加密憑據的金鑰的訪問許可權進行配置,以便僅向 Administrators 和 SYSTEM 提供訪問權。由於金鑰會被作為 SYSTEM 執行的 ASP.NET 程序讀取,因此應設定以下許可權:

  • Administrators:F

  • SYSTEM:F

  • CREATOR OWNER:F

  • ProcessAccount:R

這可以提供兩道保護資料的防線,如下所示:

  • ACL 許可權要求訪問資料的身份是 Administrator。

  • 攻擊者必須在伺服器上執行程式碼 (CryptUnprotectData API) 才能恢復帳戶的憑據。