8

データベース クエリを実行する必要がある IIS 7.0 でホストされている WCF サービスがあります。これを行うための適切な権限を取得するために、次のようにサービス内で偽装しています。

コード

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public void MyOperation(int arg)

構成

<behavior name="ReceivingServiceBehavior">
    <!-- Other behaviors -->
    <serviceAuthorization impersonateCallerForAllOperations="true" />
</behavior>

接続してクエリを実行しようとすると、次のようになります。

例外 - System.IO.FileLoadException: ファイルを読み込めませんでした、または
アセンブリ 'System.Transactions、バージョン = 2.0.0.0、カルチャ = ニュートラル、
PublicKeyToken=b77a5c561934e089' またはその依存関係の 1 つ。どちらか
必要な偽装レベルが提供されなかった、または提供された
偽装レベルが無効です。(HRESULT からの例外: 0x80070542)

ファイル名: 'System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ---> System.Runtime.InteropServices.COMException (0x80070542): 必要な偽装レベルが提供されていないか、提供された偽装レベルが無効です。(HRESULT からの例外: 0x80070542)
   System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection (IConnectionUser ユーザー) で
   System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() で
   System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() で
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (式クエリ) で
   System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() で
   System.Linq.Buffer`1..ctor(IEnumerable`1 ソース) で
   System.Linq.Enumerable.ToArray[TSource] (IEnumerable`1 ソース) で
   Fourth.GHS.MessageRelay.RegistrationDBStorage.FindRegistration (SystemKey キー) で
4

7 に答える 7

6

WCF クライアントは、必要な「許可された偽装レベル」を設定していますか?

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>

        <!-- .... -->

        <behaviors>
           <endpointBehaviors>
              <behavior name="ImpersonationBehavior">
                 <clientCredentials>
                      <windows allowedImpersonationLevel="Impersonation" />
                 </clientCredentials>
              </behavior>
           </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

何も明示的に指定されていない場合、デフォルトでこれはIdentificationに設定されます。詳細については、このブログ投稿をご覧ください。

于 2008-11-26T14:41:11.647 に答える
3

偽装された ID として SQL クエリを実行する場合は、SQL サーバーへの委任を実際に有効にする必要がある場合があります。詳細については、次の記事をご覧ください。

http://msdn.microsoft.com/en-us/library/ms730088.aspx

于 2008-11-10T15:31:36.253 に答える
1

ありがとうございます。次の宣言の下で XML を読んで解決しました。

[OperationBehavior(Impersonation:=ImpersonationOption.Required)]

XML を WCFService クラスから直接読み取った場合にのみ機能しました。

于 2009-01-08T12:09:44.803 に答える
0

うーん...わかりません。ただし、早い段階で dll を強制的にロードすることができます。IIS を使用しているので、これはおそらく global.asax にあるでしょう。TransactionScope を作成して破棄するようなものです...

于 2008-11-10T14:00:30.103 に答える
0

これをもう少し試した後、IIS ホステッド サービスの最も簡単な解決策は、必要なアクセス許可を持つドメイン ユーザーの ID を使用してアプリケーション プールを実行することです。これにはおそらくセキュリティ上の問題がありますが、私たちの目的には十分です。そのユーザーに与えられるアクセス許可を制限できますが、Kerberos、なりすまし、委任、および AD の謎に入る必要なく、すべてが機能します。

于 2008-11-11T14:31:18.903 に答える