2009-08-31 37 views
3

私は、データベースにアクセスするためのドメイン特権を持つ特別なユーザーアカウントを使用してアプリケーションプールを使用して実行されるServerAでホストされたWebサイトを持っています。ウェブサイトの設定ファイルでは、私は指定:WCFと合格ウィンドウの資格情報

<identity impersonate="true" /> 

私はその後、サーバーAにもあり、以下のように(すなわち、何の設定ファイル)をプログラムコンソールアプリケーションでホストされていないサービスを提供しています。私は私のローカルマシン上でブラウザを開き、ウェブサイトは、WCFのサーバーに接続しようとすると、エラーが返され、ウェブサイトに行くとき

Uri uri = new Uri("net.tcp://ServerA:9900/Service/"); 

ServiceHost host = new ServiceHost(typeof(Service1), uri); 

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.Message; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

ServiceEndpoint serviceEndpoint = host.AddServiceEndpoint(typeof(IService1), binding, uri); 
EndpointAddress myEndpointAddress = new EndpointAddress(uri, EndpointIdentity.CreateSpnIdentity("MyspnName")); 
serviceEndpoint.Address = myEndpointAddress; 

host.Open(); 

「認証に失敗したため、セキュリティトークンの要求を満足することができませんでした。」

ウェブサイトがサービスに接続するために、次のコードを使用しています:PRINTMESSAGE、私は呼んでいる方法については

Uri uri = new Uri("net.tcp://ServerA:9900/Service/"); 

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.Message; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

EndpointIdentity epid = EndpointIdentity.CreateSpnIdentity("MyspnName"); 
EndpointAddress endPoint = new EndpointAddress(uri, epid); 
//EndpointAddress endPoint = new EndpointAddress(uri); 

ChannelFactory<IService1> channel = new ChannelFactory<IService1>(binding, endPoint); 
channel.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation; 
IService1 service = channel.CreateChannel(); 

service.PrintMessage("Print this message!"); 

は、私が[OperationBehavior(Impersonation = ImpersonationOption.Required)]を試してみました.. .Allowed ..しかし、エラーは同じです。

LocalHostを使用してウェブサイトをローカルで実行すると、エラーはなく完全に機能します。また、自分のweb.configでidentity impersonate = "false"を変更すると、それが実行されますが、Windowsの資格情報がWCFサービスに渡されず、それがポイントになります。

アイデアは何ですか? Plsの一般的なリンクは、私はおそらくすでにそれを読んだ!

おかげでたくさん

+0

あなたの質問の一部として実際の設定ファイルのマークアップを投稿すると、本当に役に立つでしょう。解決策は、参照を追加するのを忘れることなどの単純なことかもしれません。 –

答えて

1

Windows認証を使用する場合は、あなたがここにあなたのサービスコードで、発信者の身元をつかむことができます。

ServiceSecurityContext.Current.WindowsIdentity 

このWindowsIdentityは「.nameの」プロパティのようなものが含まれ、ユーザーが所属するすべてのグループの ".Groups"プロパティなどが含まれます。

WindowsIdentityをNULLにする必要がある場合、Windows認証は実際には発生しません。

IISでWCFサービスをホストしていますか?どのバージョン - IIS7はnet.tcpバインディングをサポートする最初のバージョンです。

コンソールアプリケーションでサービスを自己ホストすると、Windows認証は機能しますか?その場合、IIS7の設定の問題が発生する可能性があります。

マルク・

+0

私はサービスを呼び出そうとするとエラーが発生します。私は自分のサービス内の情報を印刷できません。また、私は既定でコンソールアプリケーションで既に –

+0

でホストしていることを上記から見ることができますが、WCFサービスはブラウザで見ることのできるもの(デモや開始ページのようなもの)を持たないでしょう。 WcfTestClientを使用してサービスに接続できますか?あなたのVisual Studio "Common7 \ IDE"ディレクトリにあります。 –

+0

はい、同じドメインにあります。それはWcfTestClientとうまく動作し、私はVSを介してlocalyウェブサイトを実行するとき、私は上で説明したようにうまく動作します。 ServerAのIIsにWindowsの資格情報を取得していて、それが問題のWCFサービスに届いています –

0

私はあなたのサービスアカウントが委任に対して信頼されていないため、これがあると思います。 したがって、ローカルリソースへのアクセスのために呼び出し元を偽装することはできますが、TCP経由で呼び出しを行うことはできません。 Googleは「委任された」と信頼しています。

関連する問題