2012-08-09 669 views
19

我有一個相當穩定的服務器應用程序版本,已經爲數十位客戶部署了將近一年。通過安全透明方法X嘗試訪問安全關鍵方法Y失敗

一個新的客戶最近安裝的應用程序,並且正在以下錯誤:

System.MethodAccessException: Attempt by security transparent method [SomeMethod] to access security critical method [SomeOtherMethod] failed.

雙方的someMethod和SomeOtherMethod是我寫組件的方法,這是對.NET 4建成,正在運行的內一個Windows服務。如果它有所作爲,SomeOtherMethod會引用來自第三方程序集(EntLib 4.1)的類型,這些程序集是針對.NET 2.0構建的。看看EntLib 4.1的代碼,我確實看到它們同時使用了SecurityTransparent和APTC屬性,但這從來沒有引起其他客戶端的問題。

這些程序集是從.NET 2.0 CLR升級而來的,但很久以前。這個確切的代碼在其他客戶上運行得很好,我沒有明確使用APTC屬性,也沒有在任何地方使用SecurityCritical屬性。

這使我得出這樣的結論:這是一個配置問題或.NET Framework修補程序問題。是否有一個針對.NET發佈的補丁會導致這種重大變化?有沒有一個配置設置一些強制執行這種類型的檢查,默認情況下是關閉的,但我的客戶可能已啓用?

最後一點。我的服務使用SSRS RDLC來生成PDF。由於.NET 4中的一些變化,我必須強制服務通過以下配置使用傳統的安全策略:

<runtime> 
    <NetFx40_LegacySecurityPolicy enabled="true" /> 
    </runtime> 

詳情爲什麼我要做這個,看到這個計算器帖子:Very High Memory Usage in .NET 4.0

重要的一點是,我在所有其他客戶也這樣做。只有這個客戶有問題。

回答

20

感嘆,Microsoft Patterns And Practices團隊負責企業庫的模式和實踐非常令人遺憾。那麼,例外是準確的,你不能調用一個裝飾爲「我肯定會檢查安全性」的方法,這個方法是用「Meh,我不檢查安全性的代碼來檢查安全性,所以不要打亂CPU週期來檢查它」 。 Java中使用的規模以及異常規範。 CAS非常有用,但診斷異常是一件非常頭疼的事情,通常涉及您不擁有且無法修復的代碼。它在.NET 4中被棄用的很大原因。

編輯完成。爲了解決這個問題,你需要找出CAS在這裏執行的原因。最簡單的解釋是,該服務並不完全信任。 最簡單的解釋是是客戶端沒有在本地硬盤上安裝服務。或者,即使在本地組裝中,通常也是以不信任模式運行代碼,一個非常偏執狂的管理員可能更喜歡這一點。這需要使用Caspol.exe進行配置,該命令行選項與CAS一樣神祕。在不可靠的位置進行射擊解釋,您的客戶需要運行Caspol,如blog post所示。或者只是簡單地在本地部署服務,以便默認的「我信任你」適用。

由OP發現的真實原因進行編輯:當從非信任的Internet或網絡位置下載文件時,請注意將文件添加到文件中的alternate data stream。該文件將得到一個名爲「Zone.Identifier」的流,通過「ZoneId」值來跟蹤它來自哪裏。這是超越從存儲位置獲得的信任的價值。通常將其放入Internet區域。使用資源管理器,右鍵單擊該文件並單擊「解除阻止」以移除該流。之後你確定你可以信任的文件:

+1

這是有道理的。我今天檢查這個。我的首先想到的是,由於Windows中的功能,標記通過電子郵件或IE下載的文件是不安全的,因此組件被封鎖。我以前曾經咬過我。 – RMD 2012-08-20 15:12:49

+3

您的回答非常有幫助。事實上,事實證明,這是被阻塞的組件。刪除文件阻塞(屬性 - >解除阻止)解決了問題。 – RMD 2012-08-20 18:14:35

+2

@RMD謝謝!該死的你的Windows。 – JefClaes 2014-06-26 10:46:59

9

在情況下,它可以幫助別人我後我對這個問題的解決方案:

1)在AssemblyInfo.cs中,刪除/評論的[裝配:SecurityTransparent]線。

2)類和執行實際工作被標記爲[SecuritySafeCritical],在我的情況下建立網絡連接的方法:

[SecuritySafeCritical] 
public class NetworkConnection : IDisposable 
{ 
    [SecuritySafeCritical] 
    public NetworkConnection(string networkName, NetworkCredential credentials) 
    { 
     ............. 
    } 
} 

3)來電顯示類和方法是市場[SecurityCritical]:

[SecurityCritical] 
public class DBF_DAO : AbstractDAO 
{ 
    [SecurityCritical] 
    public bool DBF_EsAccesoExclusivo(string pTabla, ref ArrayList exepciones) 
    { 
     .... 
     using (new NetworkConnection(DBF_PATH, readCredentials)) 
     { 
      .... 
     } 
    } 
} 
+0

謝謝Jhollman。我遇到了同樣的問題。這是幫助我解決的問題 – TrieuH 2014-10-08 09:53:21

0

對我來說,這是一個問題,當我在解決一些包覆蓋System.Web.Mvc組裝版本在主網站項目結合管理的的NuGet包。設置回4.0.0.0(我安裝了5.0)。我沒有改變注意到這個改變,因爲Mvc v4.0是通過GAC安裝和訪問的。退回

8

我在使用ServiceModelEx庫時從http://www.idesign.net/運行下載的WCF示例時遇到類似問題。 我註釋掉中的AssemblyInfo.cs以下行ServiceModelEx項目

//[assembly: AllowPartiallyTrustedCallers] 

,它爲我工作。

+0

我正在使用ClickOnce部署的WinForms應用程序中使用庫。 ClickOnce是一個擁有上述CAS hans-passat的野獸。幸運的是,我有庫的源代碼,所以註釋掉上面的這一行對我來說是固定的。 – bizl 2016-04-25 11:09:43

+0

優秀,它爲我工作! – 2017-06-13 20:52:38

+0

謝謝 - 經過大量搜索後,這對我有效。看來如果你的一些程序集在它們的AssemblyInfo.cs/.vb文件中有這個指令,而有些則不是那個.net變得混亂的地方 - 刪除它的所有實例似乎解決了這個問題 – CResults 2018-01-09 15:31:01