0

だから私はこれに頭をぶつけてきました。私は自己ホスト型の WCF サービスを持っています:

var webServiceHost = new WebServiceHost(helloWorld);
webServiceHost.Authorization.ImpersonateCallerForAllOperations = true;

var uri = new Uri(BaseUri + webService.UriDirectory);
var webHttpBinding = new WebHttpBinding(webHttpSecurityMode);
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

var sep = webServiceHost.AddServiceEndpoint(IHelloWorld, webHttpBinding, uri);
var webHttpBehavior = new WebHttpBehavior {HelpEnabled = true};
sep.Behaviors.Add(webHttpBehavior);

webServiceHost.Open();

メソッドに次の属性を適用しました。

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public List<GpoItem> GetAll()
{
    using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
    {
        // Execute GPO code here...
        return new List<GpoItem>();
    }
}

もう少しコンテキストを追加するために、私は基本的に、人が Web ページにログインし、ドメインに GPO を作成できるようにする Web サービスを用意しています。ログインしたドメインユーザーとして実行しているため、コンソールでこれを実行しても問題なく動作します。Windows サービスとして実行すると、「アクセスが拒否されました」という例外がスローされます。したがって、なりすましの必要性。上記の次の変更されたコードを挿入すると、「操作エラーが発生しました。(HRESULT からの例外: 0x80072020)」。まだ許可の問題であることを示すグーグル。管理者として Web サービスのテスト環境にログインしているため、フル アクセスが可能であり、管理者としてコンソールで問題なく実行できることを示しました。どこかでフラグ設定が欠けているような気がします。

何か案は?

[Update1]サービスをローカル システムからネットワーク サービスに切り替えてみましたが、それでも同じ問題が発生します。

[Update2] WCF サービスをホストしているサーバー (ローカル システムとして実行されている) にログオンし、そのマシンで直接ブラウザーを使用すると、すべて正常に動作します。ユーザー認証の委任に関する問題のようです...ここではまだ不明です。

4

1 に答える 1

0

どうやら、ローカルリソースアクセスにのみ使用できるWCF属性から偽装レベルのトークンしか取得できないようです。代わりに、ネットワーク リソースにアクセスできるデリゲート レベルのトークンを取得できるように、LogonUser API を使用する必要がありました。[1]

[1] http://msdn.microsoft.com/en-us/library/ff649252.aspx

于 2011-12-22T14:37:28.633 に答える