4

SQL ストアド プロシージャを呼び出す WCF サービス メソッドがあります。IIS 5 を使用して開発しています (それについてはあまりできません。II6/7 は利用できません)。

いくつかの利点を得るために、呼び出しを ac# TPL タスクに入れて、このストアド プロシージャへの非同期呼び出しをいくつか実行しています。

タスクとして実行すると、SQL 例外が発生します...「ログインに失敗しました。ログインは信頼されていないドメインからのものであり、Windows 認証では使用できません」

ただし、タスクを使用せずにまったく同じプロセスを実行すると、SQL接続に問題はありません

IIS 仮想フォルダー (WCF) の資格情報がタスクに委任されていないように見えますか? TPLタスクスレッドの資格情報を特定する方法、つまり親などと同じものを使用する方法はありますか?

Windows 認証 (sspi) と偽装を使用して、別の SQL ボックスに接続できるようにしています。

あなたの助けに感謝します。

4

2 に答える 2

5

選択肢は 2 つあります。

1) 以下を使用して、常に ID をフローするようにアプリケーション全体をオプトインします。

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

これには、オーバーヘッドの副作用と、アプリケーション ID ではなく、現在呼び出し中のユーザーの権限を使用して意図しないコードを誤って実行する危険性があります。私は個人的にこれを避け、明示的にオプトインする#2を使用します.

WindowsIdentity2) TPL タスクを設定する前に をキャプチャし、Impersonate+を使用して呼び出しを行う必要がある場所を明示的に偽装しWindowsImpersonationContextます。

public void SomeWCFOperation()
{
    WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent();

    Task.Factory.StartNew(() =>
    {
         // some unpriviledged code here


         using(WindowsImpersonationContext impersonationContext = currentIdentity.Impersonate())
         {
            // this code will execute with the priviledges of the caller
         }

         // some more unpriviledged code here
    });  
}
于 2012-04-06T16:03:17.850 に答える
0

別の回避策として、次のように TPL の拡張機能を作成できます。

public static class TaskFactoryExtensions
{
    public static Task StartNewImpersonated(this TaskFactory taskFactory, Action action)
    {
        var identity = WindowsIdentity.GetCurrent();
        return taskFactory.StartNew(() =>
        {
            using (identity.Impersonate()) 
            {
                action();
            }
        });
    }

    public static Task<TResult> StartNewImpersonated<TResult>(this TaskFactory taskFactory, Func<TResult> function)
    {
        var identity = WindowsIdentity.GetCurrent();
        return taskFactory.StartNew<TResult>(() =>
        {
            using (identity.Impersonate())
            {
                return function();
            }
        });
    }
}

次に、標準の StartNew メソッドの代わりにこれらの新しいメソッドを呼び出します。

これの欠点は、オーバーライドするメソッドがたくさんあることです。

于 2012-08-30T14:31:29.837 に答える