2

1 つの Web サイトと複数のプロジェクトで解決策を見つけました。
プロジェクトはすべてAllowPartiallyTrustedCallers属性を持ち、厳密な名前が付けられています。

サイトは完全に信頼して動作します。ただし、信頼を中に設定した後System.Security.SecurityException: Request failed. 、サイトを参照するとすぐにエラーが発生します。

私のプロジェクトではLogOnUser、さまざまなSystem.DirectoryServices.AccountManagementメソッドへの呼び出しだけでなく、への呼び出しもあります。

このサイトは中程度の信頼で実行できますか、それともすべての LDAP 呼び出しに対して完全に信頼する必要がありますか?

前述したように、AllowPartiallyTrustedCallersすべてのプロジェクトに属性を設定しました。他に何をすべきかわからない。
また、エラーがどこで発生しているのかわかりません。サーバーのイベント ログには、この SecurityException に関して何も記録されていません。エラーの場所を見つける方法はありますか?コードを書き直してみてください。

[Win2k8R2 で .NET 4.0 を実行]

4

2 に答える 2

4

LogOnUser、すべての P/Invoke 呼び出しと同様SecurityPermissionに、UnmanagedCode許可フラグが必要です。System.DirectoryServices.AccountManagementunrestricted が必要DirectoryServicesPermissionです。どちらのアクセス許可も、中程度の信頼の ASP.NET アプリケーションには既定で付与されません。

このAllowPartiallyTrustedCallers属性により、完全信頼アセンブリを部分信頼アセンブリで使用できるようになります。あなたの場合、bin フォルダー内のすべてのアセンブリが部分信頼アプリケーション ドメインに読み込まれるため、属性は効果がありません。

アプリケーションを中程度の信頼で実行する必要があり、アセンブリを GAC にインストールできる場合は、追加のアクセス許可を必要とするコードを含むアセンブリを作成し、アセンブリに のマークAllowPartiallyTrustedCallersを付けて、GAC に配置できます。Assertまた、引き続き発生するスタック ウォークを抑制するために必要な権限も必要です。

詳細については、MSDN ライブラリの「 ASP.NET 4 アプリケーションのコード アクセス セキュリティ」トピックを参照してください。

于 2012-06-05T14:32:29.243 に答える
0

@Michael Liuの答えは正しいですが、この分野での実用的な知識が限られている初心者(私のような)には簡単に理解できません。この回答は、マイケルの回答を補足することを目的としています。

"full"以外の信頼レベルを使用するように web.config が構成されている場合

<trust level="Full"/>

独自のポリシー ファイルを作成しないと、Active Directory に接続できません。独自のポリシー ファイル (たとえば、「myPolicyFile.config」という名前) を作成したら、ASP.NET アプリケーションが Active Directory に接続できるように、それをカスタマイズする準備が整います。

必要な変更は次のとおりです。

web.config で、カスタム ポリシー ファイルを使用するように Web サイトを構成します。

<system.web>
    ...
    <securityPolicy>
        <trustLevel name="myMediumPolicy" policyFile="myPolicyFile.config"/>
    </securityPolicy>

    <trust level="myMediumPolicy"/>
    ...
</system.web>

次に、myPolicyFile.config ファイルに、次のように「SecurityClass」および「IPermission」エントリを追加します。

<configuration>
    ...
        <PolicyLevel version="1">
            <SecurityClasses>
                ....
                <SecurityClass Name="DirectoryServicesPermission" Description="System.DirectoryServices.DirectoryServicesPermission, System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
                ....
            </SecurityClasses>
            <NamedPermissionSets>
                <PermissionSet
                        class="NamedPermissionSet"
                        version="1"
                        Name="ASP.Net">
                    ...
                    <IPermission
                            class="DirectoryServicesPermission"
                            version="1"
                            Unrestricted="true"
                    />
                    <IPermission
                            class="SecurityPermission"
                            version="1"
                            Flags="Execution, ControlThread, ControlPrincipal, RemotingConfiguration, UnmanagedCode"
                        />
                    ...
                </PermissionSet>
            </NamedPermissionSets>
        </PolicyLevel>
    ...
</configuration>

注: <IPermission class="SecurityPermission"... /> ノードが既に存在している可能性があります (myPolicyFile.config ファイルに基づいたシステム定義の信頼レベル ファイルによって異なります)。既に存在する場合は、", UnmanagedCode" というテキストを "Flags" 属性に追加するだけです。まだ存在しない場合は、上記の例をコピーして "ASP.Net" NamedPermissionSet に貼り付けます。

最後に、変更を保存して Web サイトをリロードします。あなたは行く準備ができているはずです!

于 2015-02-25T23:40:28.380 に答える