2011-08-01 14 views
0

私はWCFとそのセキュリティの新機能ですので、私が抱えている問題についていくつかの助けを求めていました。WCFサービスのドメイン間認証で問題が発生しました

小さなドメイン内のすべてのマシンに展開するWCFサービスがあります。 WCFサービスは、呼び出される必要があるメソッドが昇格されているため、Windowsサービスでホストされます。このサービスは現時点で非常にドラフトです(メタデータを公開していますが、これは後で無効にすると考えています)。これは、バインディングnet.tcpを使用しています - サービスのApp.configファイルを以下に示します。クライアントのために

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="SvcBehavior" name="Microsoft.ServiceModel.Samples.Svc"> 
     <endpoint address="" binding="netTcpBinding" 
      contract="Microsoft.ServiceModel.Samples.ISvc" /> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://*:8100/ServiceModelSamples/service" /> 
      </baseAddresses> 
      <timeouts closeTimeout="00:10:00" openTimeout="00:10:00" /> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="SvcBehavior"> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

、私はWinformsのC#アプリケーションを持っています。アプリケーションは2つの機能を提供し、サービスから静的な情報を引き出し、ユーザーに管理方法の認証と呼び出しのオプションを提供します。したがって、認証はクライアントレベルで行われます。

:その事実空 - 私は、ホスト名が可変であるため、サービスに接続するためのChannelFactoryを使用しています(ユーザーがクライアント起動時に入力を求められ)とクライアントのapp.configファイルを以下に示します

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

のChannelFactoryコードがある:私は同様にサービスのメソッドをdescrivesインタフェースを有する

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples", ConfigurationName = "ISvc")] 


ChannelFactory<ISvc> myChannelFactory = new ChannelFactory<ISvc>(new NetTcpBinding(), "net.tcp://" + HostName + ":8100/ServiceModelSamples/service"); 
     public static ISvc client = null; 

私が持っている主な問題はこれです。そこには、Machine1Machine2domainAで動作しているとします。 Machine1がサービスをホストし、Machine2がクライアントを実行すると仮定します。

私は、ドメインアカウントドメインA \ユーザーを使用してサービスに接続した場合、サービスが正常に動作しますが、私はMACHINE2上のローカルユーザーを持っているとMACHINE2 \ localuserのとしてサービスに接続したいと言う、私は次のエラーメッセージが表示されます。

サーバーがクライアント資格情報を拒否しました。

セキュリティモードをnoneに設定してみましたが、クライアントとサービスに設定が一致しないというエラーが表示されました。

これを解決する方法はありますか?また、domainA \ Machine1で実行されているサービスが別のドメインのユーザーによって呼び出された場合、つまりdomainB \ User2の場合はどうなりますか?

ありがとうございます - 私はこのことについていくつかの洞察に感謝します!

チャダ

答えて

2

あなたは同様にクライアントにオフで有効にする必要があり、サービスのセキュリティをオフにした場合。コードでクライアントを設定する場合は、コンフィグレーションファイルのサービスと同様に、新しいインスタンスのコンフィグレーションをNetTcpBindingに設定する必要があります。

Windowsセキュリティが使用されている場合(デフォルトではNetTcpBinding)、MachineBはMachineAのローカルアカウントを認証できません(重複したローカルユーザーのトリックがありましたが、WCFでも動作するかわかりません)。だからあなたはドメインを持っているのです。ドメイン間認証には、ドメイン間の信頼が必要です。

クロスドメインユーザーまたはローカルユーザーを認証する必要がある場合は、Windows認証を使用できません。他の認証メカニズムもありますが、(少なくともサービス上で)証明書を設定し、クライアント認証のためにクライアント証明書またはユーザー名とパスワードを使用する必要があります。

+0

お返事ありがとうございます - 私は実際にはWindows認証のクロスドメインに依存していないか、標準の認証でローカルのPCアカウントを使用しています - これは私が追求を止めるものです。ただし、証明書と一緒にユーザー名/パスワード認証を使用することは可能ですか?また、クライアントセキュリティをオフに設定するためのアドバイスがあります(これに頼る必要がある場合)。 - サービス参照を使用した例がありましたが、channelfactoryを使用していません。 – Chada

+0

証明書なしでユーザー名とパスワードを使用することはできません。さらに、証明書なしのユーザー名とパスワード=セキュリティなし。 –

+0

クライアントでセキュリティを設定する必要がある場合は、インスタンス化する 'NetTcpBinding'を設定してください。それはあなたが[documentation](http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx)でできるはずのものです –

関連する問題