13

clickonce を使用して展開される .net 3.0 アプリケーションを開発しました。

展開を容易にするために、完全信頼から部分信頼に移行したいと考えています。

Visual Studio のプロジェクトの [セキュリティ] タブにある [アクセス許可の計算] ツールを試してみましたが、答えは非常に明確です。

---------------------------
Microsoft Visual Studio
---------------------------
This application requires full trust to run correctly.

ただし、完全な信頼が必要な理由を理解できませんでした。セキュリティ設定を「部分信頼」に変更しようとしましたが、アプリケーションは起動直後に SecurityException を発生させます。

System.Security.SecurityException   {"Request failed.", Action= "System.Security.Permissions.SecurityAction.LinkDemand"
   at MyNameSpace.Program.Main(String[] args)
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
   at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
   at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
   at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
   at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
   at System.Activator.CreateInstance(ActivationContext activationContext)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

私のソフトウェアはおそらく完全な信頼を必要としません (私は https を使用してのみ Web サーバーに接続し、インポート/エクスポートの目的でユーザーの要求があった場合にのみファイルシステムにアクセスします)

アプリケーションが完全な信頼を必要とする理由を特定するにはどうすればよいですか?

4

7 に答える 7

10

私の問題は、アセンブリが強く署名されていることが原因のようです。

msdnより引用

厳密な名前のアセンブリでは、パブリックにアクセス可能なすべてのメソッド、プロパティ、およびイベントに LinkDemand が適用され、完全に信頼された呼び出し元だけが使用できるように制限されます。この機能を無効にするには、AllowPartiallyTrustedCallersAttribute 属性を適用する必要があります。

必要な属性をアセンブリに追加しています。結果がどうなるかをお知らせします。

[assembly:AllowPartiallyTrustedCallers]

更新: 属性をアセンブリに追加しましたが、いくつかの .net アセンブリも使用しています。

すべての .net アセンブリが部分的に信頼されたアセンブリ (ここにリストがあります) で使用できるわけではありません。つまり、WCF アセンブリ (つまり、System.ServiceModel) はリストにありません。

ただし、Microsoft は、部分信頼環境で WCF を使用できると述べています (こちらを参照) 。

参照から不要なアセンブリをすべて削除しようとしましたが、すべてのアセンブリで AllowPartiallyTrustedCallers を使用しましたが、まだスタックしています...

于 2009-02-17T17:14:08.487 に答える
4

Microsoft には、アセンブリを分析し、次のような詳細な xml 出力ファイルを生成するpermcalcというツールがあります。

<Type Name="MyClass">
<Method Sig="instance void .ctor()">
<Demand>
<PermissionSet version="1" class="System.Security.PermissionSet">
  <IPermission version="1" class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
  <IPermission version="1" class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
...
于 2009-02-17T19:32:16.720 に答える
2

app.configのconfigsectionsにrequirePermission='false'属性を追加すると、非常に役立ちます。

 <sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section requirePermission="false" name="defaultProxy" type="System.Net.Configuration.DefaultProxySection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>

それは私にとってトリックになりました!

于 2009-02-18T09:37:24.957 に答える
2

例外メッセージは、部分信頼で実行できない理由を示しています。

System.Security.Permissions.SecurityAction.LinkDemand

これをコピーして Google に貼り付けると、アプリケーションが完全な信頼を必要とする理由を理解するのに役立つ関連記事が MSDN にいくつか見つかります。

于 2009-02-17T17:09:27.283 に答える
0

うーん、推測ですが、ネットワーク共有から実行されていますか? .NET は、コードが実行されている場所に基づいて信頼を割り当てているようです。ローカルのハード ドライブ以外からの場合は、セキュリティ上の問題が発生します。

于 2009-02-17T16:58:47.323 に答える
0

アプリケーションのコードを見なければ、それを判断することはできません。アプリに完全な信頼を必要とするものがありますが、見落としている可能性があります (おそらく依存関係ですか?)。

于 2009-02-17T16:58:51.690 に答える
0

スタック トレースには、要求されているアクセス許可の種類が表示されません。

この場合、AllowPartiallyTrustedCallers は役に立ちません。部分的に信頼されたコードが信頼されたアセンブリを呼び出す場合など、呼び出し先で指定する必要があります。あなたの状況では、この属性が定義されていないアセンブリをアプリが呼び出すかどうかを調べる必要があります。はいの場合、アプリは完全信頼で実行する必要があり、部分信頼ではまったく機能しません (これが CAS の強制方法であり、設計によるものです)。

それ以外の場合は、permcalc を使用してください。プロジェクトのセキュリティ設定で有効にする必要がある権限が表示されます。ただし、これらすべての権限を含めた後でも、「部分的な信頼」が維持されるか、完全な信頼が維持され、いくつかの権限が削除されるかはわかりません。これは、部分信頼が非常に制限的であるという事実によるものです (security.config を開き、有効なアクセス許可を確認してください)。私が知る限り、WebPermission はありません (http 要求を送信するために必要です)。FileIOPermission と同じです。

于 2009-02-17T20:14:03.733 に答える