36

カスタム構成セクションを備えたWebアプリケーションがあります。そのセクションには、暗号化したい情報が含まれています(自分で行うのではなく、ASPNet_RegIISを使用することを望んでいました)。

Web.Config:

<?xml version="1.0"?>

    <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
      <configSections>
          <section name="MyCustomSection" 
                   type="MyNamespace.MyCustomSectionHandler, MyAssembly"/>
    </configSections>
<configProtectedData>
    <providers>
      <clear />
      <add name="DataProtectionConfigurationProvider"
           type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
                   Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
                   processorArchitecture=MSIL"
           keyContainerName="MyKeyContainer"
           useMachineContainer="true" />
    </providers>
  </configProtectedData>
    <MyCustomSection>
       <blah name="blah1">
          <blahChild name="blah1Child1" />
       </blah>
    </MyCustomSection>

構成ハンドラーは、暗号化を試みる前にうまく機能します。私がそれを暗号化しようとすると:

aspnet_regiis -pef "MyCustomSection" c:\ inetpub \ wwwroot \ MyWebsite -prov DataProtectionConfigurationProvider

エラーが発生します:

構成セクションを暗号化しています...MyCustomSectionの構成セクションハンドラーの作成中にエラーが発生しました:ファイルまたはアセンブリ'MyAssembly'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。(c:\ inetpub \ wwwroot \ MyWebsite \ web.config 5行目)

プロバイダーを構成して/なしで試しました。セクショングループあり/なし。事前にウェブサイトを開始した/なし。登録のために一時的にアセンブリをGACに入れてみました。また、log4netセクションを試してみましたが、運が悪かったので、自分のものではないものを試してみました。管理者としてコマンドプロンプトを実行しました。何か案は?または、ASPNet_RegIISをカスタムセクションに使用することはできませんか?

MSDNを表示した後の最後のショットは、2.0で技術的に非推奨になったため(aspnet_regiisバージョンに関するものであると期待して)、IConfigurationSectionHandlerを実装するのではなくConfigurationSectionから継承するようにハンドラーを変更することでした。そこにも運がない。

どんなアイデアでも私に知らせてください。ありがとう!

4

5 に答える 5

38

aspnet_regiisアセンブリをバインドできる必要があります。通常の .net バインディング ルールが適用されます。

aspnet_regiis_bin同じディレクトリで 呼び出されるディレクトリと、次のようなプライベートパスとしてaspnet_regiis.exeaspnet_regiis.exe.configファイルを作成することで、これを回避します。aspnet_regiis_bin

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="aspnet_regiis_bin"/>
      </assemblyBinding>
   </runtime>
</configuration>

次に、カスタム構成セクションを定義するアセンブリをコピーして、それらを見つけられるようにしますaspnet_regiis_binaspnet_regiis

この手順では、アセンブリに厳密な名前を付けたり、GAC に配置したりする必要はありませんが、フレームワーク ディレクトリをいじる必要があります。

于 2011-06-15T20:02:46.233 に答える
19

configSections 要素の内容を一時的にコメントアウトする回避策を使用しています。

<configSection>
    <!--
    <section name="CustomSection" type="" />
    -->
</configSection>

aspnet_regiis -pefその後、通常どおりに暗号化を実行できます。これが実行された後、セクションのコメントを外すだけで、サイトを実行する準備が整います。

于 2013-07-19T01:29:21.420 に答える
4

これは完全なハックですが、カスタムセクションを定義するアセンブリに厳密に名前を付けてGAC化することなく、別の方法があるかどうかはわかりません(ただし、それも機能しなかったとおっしゃっていましたが、よくわかりません。なぜそうではないのか)。aspnet_regiisは<ドライブ>:\ Windows \ Microsoft.Net \ Framework \ <バージョン>フォルダー(WinXP内)で実行されるため、構成セクションを定義するDLLを関連するFramework\<バージョン>フォルダーにコピーしてから動作するはずです。

于 2009-04-24T17:21:40.463 に答える
4

記録のために、私はこれを行うための小さなメンテナンス ページを作成しました。

var currentConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/");
// Unprotect
ConfigurationSection section = currentConfig.GetSection("MyCustomSection");
if (section.SectionInformation.IsProtected)
{
   section.SectionInformation.UnprotectSection();
   currentConfig.Save();
}

// Protect
if (!section.SectionInformation.IsProtected)
{
     section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
     currentConfig.Save();
}

警告: プロセスには、変更する構成ファイルへの書き込みアクセスが必要です。誰がこれを実行できるかを承認する何らかの方法が必要になるでしょう。通常、保存するときに Web サイトを再起動します。

于 2013-07-19T12:16:38.150 に答える
2

正解と表示されている答えが正解です。コメントを追加したかったのですが、コメントが長すぎるためできませんでした (構成エントリの例)。

セクション名には、アセンブリの完全な名前を使用する必要があります。ランタイム アセンブリ修飾は、aspnet_regiis.exe では機能しません。

これは機能します:

<configSections>
  <section name="securityConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security, Version=5.0.414.0, Culture=neutral, PublicKeyToken=9c844884b2afcb9e" />
</configSections>

しかし、これは機能しません:

<configSections>
  <section name="securityConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security" />
</configSections>

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <qualifyAssembly partialName="Microsoft.Practices.EnterpriseLibrary.Security" fullName="Microsoft.Practices.EnterpriseLibrary.Security, Version=5.0.414.0, Culture=neutral, PublicKeyToken=9c844884b2afcb9e" />
    </assemblyBinding>
</runtime>
于 2012-01-23T20:04:00.840 に答える