2012-08-09 11 views
19

私はかなり安定したサーバーアプリケーションバージョンを持っており、数十人のユーザーにほぼ1年間展開されています。セキュリティで保護されたメソッドXによるセキュリティ上の重要なメソッドYへのアクセスが失敗しました。

一つの新しい顧客最近セットアップアプリケーションとは、次のエラーを取得している:

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

のsomeMethodとSomeOtherMethod両方は、.NET 4に対してビルドされている私が書いたアセンブリ内のメソッドは、であり、内部のことを実行していますWindowsサービス。違いがある場合、SomeOtherMethodは.NET 2.0用に構築されたサードパーティアセンブリ(EntLib 4.1)の型を参照します。 EntLib 4.1のコードを見ると、SecurityTransparent属性とAPTC属性の両方を使用していることがわかりますが、これは他のクライアントで問題を引き起こしたことはありません。

これらのアセンブリは.NET 2.0 CLRからアップグレードされましたが、以前はありました。この正確なコードは他の顧客でもうまく動作していますが、APTC属性を明示的に使用しているわけではなく、SecurityCritical属性をどこでも使用しています。

これは構成上の問題またはおそらく.NET Frameworkのパッチの問題であるという結論に至りました。この破損の原因となる.NET用のパッチがリリースされましたか?デフォルトではオフになっているが、顧客が有効にしている可能性があるこの種のチェックを強制する設定をいくつか設定していますか?

最後の1つです。私のサービスでは、SSRS RDLCを使用してPDFを生成しています。原因.NET 4でいくつかの変更に、私は次の設定を経由して、従来のセキュリティポリシーを使用するようにサービスを強制する必要があります:私はこれを行う必要がある理由の詳細については

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

を、このstackoverflowの記事を参照してください。Very High Memory Usage in .NET 4.0

重要な点は、他のすべての顧客にも同じことを行うことです。この顧客だけが問題を抱えています。

答えて

20

一言、エンタープライズライブラリを担当するMicrosoft Patterns and Practicesチームが採用しているパターンとプラクティスはかなり嘆かわしいものです。まあ、例外は正確です、あなたは "私は間違いなくセキュリティをチェックする"と装飾されたメソッドを呼び出すことはできません "Mehで装飾されたコードから、私はセキュリティをチェックしませんので、 。 Javaで使用されている例外仕様と同様に拡張されます。 CASは信じられないほど便利ですが、例外を診断することは重大な頭痛であり、しばしば自分が所有していないコードを修正することはできません。大きな理由は.NETで廃止されました。

編集が完了しました。この問題を解決するには、ここでCASがなぜ強制されているのかを調べる必要があります。その最も簡単な説明は、サービスが完全な信頼で実行されていないということです。 の最も単純な説明は、クライアントがローカルハードドライブにサービスをインストールしなかったことです。です。あるいは、一般的には、地元のアセンブリでも、信頼できないモードでコードを実行しています。非常に妄想的な管理者は、それを好むかもしれません。これは、コマンドラインオプションがCASと同じくらい神秘的なツールであるCaspol.exeで構成する必要があります。信頼できない場所の説明でポットを撮ると、クライアントはCaspolをこのblog postのように実行する必要があります。または単にサービスをローカルに展開するだけで、デフォルトの "I believe thee"が適用されます。

OPで発見された本当の理由で編集:alternate data streamが信頼できないインターネットやネットワークの場所からダウンロードされたときにファイルに追加されることに注意してください。このファイルには、 "ZoneId"という名前のストリームが得られます。このストリームには、 "ZoneId"という値がどこから来たのかを記録します。その値は、保管場所から派生した信頼を無効にします。通常はインターネットゾーンに置く。エクスプローラを使用してファイルを右クリックし、[ブロック解除]をクリックしてそのストリームを削除します。あなたはそれが私がこの問題のために私の解決策を投稿し他の人を助け場合は、ファイル:)

+1

これは意味があります。私は今日これをチェックしている。私の考えは、実際には、電子メールまたはIE経由で安全でないとダウンロードされたファイルにフラグを付けるWindowsの機能のために、アセンブリがブロックされていると考えました。私はこれを以前に噛んだ。 – RMD

+3

あなたの答えはとても役に立ちました。実際には、物事を詰まらせるブロックされたアセンブリであることが判明しました。ファイルのブロックを削除すると([プロパティ] - > [ブロック解除])、問題は解決されました。 – RMD

+2

@RMDありがとう!あなたはWindowsだ。 – JefClaes

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

0

私はいくつかのパッケージはメインのWebサイトプロジェクトに結合System.Web.Mvcアセンブリのバージョンを上書きし、溶液中NuGetパッケージを管理する場合、それが問題でした。 4.0.0.0に戻してください(私は5.0をインストールしました)。 Mvc v4.0がインストールされ、GAC経由でアクセス可能であったため、変更に気付かなかった。戻り値

8

ServiceModelExライブラリを使用しているときに、ダウンロードしたWCFサンプルをhttp://www.idesign.net/から実行しているときに同様の問題が発生しました。 私は

//[assembly: AllowPartiallyTrustedCallers] 

ServiceModelExプロジェクトのAssemblyInfo.csに以下の行をコメントアウトし、それが私のために働きました。

+0

私はClickOnce経由で配布されたWinFormsアプリケーションの中でライブラリを消費していました。 ClickOnceは上記の@ hans-passatのようなCASを持つ獣です。幸運にも私はライブラリのソースコードを用意していました。 – bizl

+0

優秀、それは私のために働いた! –

+0

ありがとうございます - これは私のために働いた検索の多くの後。アセンブリの中にはAssemblyInfo.cs/.vbファイル内にこのディレクティブが含まれているものもあれば、そうでないものもあります.netは混乱しています。すべてのインスタンスを削除すると問題が解決するようです – CResults

関連する問題