24

私はかなり安定したサーバーアプリケーションバージョンを持っており、これは数十の顧客にほぼ1年間展開されています。

最近、ある新しい顧客がアプリケーションをセットアップし、次のエラーが発生しました。

System.MethodAccessException:セキュリティ透過メソッド[SomeMethod]によるセキュリティクリティカルメソッド[SomeOtherMethod]へのアクセスに失敗しました。

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

これらのアセンブリは.NET2.0CLRからアップグレードされましたが、かなり前のことです。この正確なコードは他の顧客でも問題なく実行されており、APTC属性を明示的に使用しておらず、SecurityCritical属性をどこでも使用していません。

これにより、構成の問題か、おそらく.NETFrameworkのパッチの問題であるという結論に至ります。この重大な変更を引き起こす.NET用にリリースされたパッチはありますか?このタイプのチェックを強制する構成設定はありますか?デフォルトではオフになっていますが、顧客が有効にしている可能性がありますか?

最後にもう1つ。私のサービスはSSRSRDLCを使用してPDFを生成します。.NET 4でのいくつかの変更により、次の構成を使用して、サービスにレガシーセキュリティポリシーを使用するように強制する必要があります。

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

これを行う必要がある理由の詳細については、このスタックオーバーフローの投稿を参照してください:.NET4.0での非常に高いメモリ使用量

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

4

4 に答える 4

24

ため息をつく、エンタープライズライブラリを担当するMicrosoft PatternsAndPracticesチームによって採用されたパターンとプラクティスはかなり嘆かわしいものです。例外は正確です。「セキュリティをチェックします」と装飾されたコードから、「セキュリティを確実にチェックします」と装飾されたメソッドを呼び出すことはできません。 。これは、Javaで使用される例外仕様と同様に拡張されます。CASは非常に便利ですが、例外の診断は大きな頭痛の種であり、多くの場合、所有しておらず修正できないコードが関係しています。.NET4で非推奨になった大きな理由。

編集が完了しました。問題に焦点を当てて、CASがここで実施されている理由を見つける必要があります。そのための最も簡単な説明は、サービスが完全に信頼されて実行されていないということです。そのための最も簡単な説明は、クライアントがローカルハードドライブにサービスをインストールしなかったということです。または、ローカルアセンブリでも、一般的にコードを信頼できないモードで実行している場合は、非常に偏執的な管理者がそれを好む可能性があります。これは、コマンドラインオプションがCASと同じくらい神秘的なツールであるCaspol.exeで構成する必要があります。信頼できない場所の説明でのポットシューティングでは、このブログ投稿に示されているように、クライアントはCaspolを実行する必要があります。または、単にサービスをローカルにデプロイして、デフォルトの「Itrustthee」が適用されるようにします。

OPによって発見された本当の理由での編集:信頼できないインターネットまたはネットワークの場所からダウンロードされたときにファイルに追加される代替データストリームに注意してください。ファイルは、「ZoneId」値でどこから来たかを追跡する「Zone.Identifier」という名前のストリームを取得します。保管場所から得られた信頼を上書きするのはその値です。通常はインターネットゾーンに配置します。エクスプローラーを使用してファイルを右クリックし、[ブロック解除]をクリックしてそのストリームを削除します。ファイルを信頼できることを確認したら:)

于 2012-08-13T21:30:20.770 に答える
10

それが他の人を助ける場合に備えて、私はこの問題の解決策を投稿します:

1)AssemblyInfo.csで、[assembly: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))
        {
            ....
        }
    }
}
于 2013-07-06T16:27:38.637 に答える
9

ServiceModelExライブラリを使用しているときにhttp://www.idesign.net/からダウンロードしたWCFサンプルを実行しているときに、同様の問題に直面していました。ServiceModelExプロジェクトのAssemblyInfo.csで以下の行をコメントアウトしました

//[assembly: AllowPartiallyTrustedCallers]

そしてそれは私のために働いた。

于 2015-07-30T16:34:58.317 に答える
0

私の場合、ソリューションでNuGetパッケージを管理したときに問題が発生しました。一部のパッケージは、メインWebサイトプロジェクトのSystem.Web.Mvcアセンブリバージョンバインディングをオーバーライドします。4.0.0.0に戻します(5.0をインストールしました)。Mvc v4.0がインストールされ、GAC経由でアクセスできるため、変更に気づきませんでした。後退する

于 2015-02-06T09:32:56.477 に答える