2010-11-29 53 views
2

同じIISサーバー上に2つのWebサイトがホストされています。 SiteAには、SiteBがアクセスする必要があるWCFサービスと、ドメインで認証されたその他のサービスが含まれています。WCFセキュリティの設定(wsHttpBinding)

サービスはwsHttpBindingで設定されているため、デフォルトではWindowsセキュリティが使用されていると思います。今では、ローカルマシン上で実行されているコンソールアプリケーションから、デフォルトのVisual Studio Webサーバーで実行されているWebアプリケーションからサービスを呼び出すことができるので、認証が機能していると思います。

ただし、SiteBがサービスにアクセスしようとすると、このエラーで失敗します。 呼び出し元がサービスによって認証されませんでした。

SiteBはSiteAと同じマシン上で動作するため、なぜ認証できなかったのかわかりません。 SiteBはフォーム認証を使用し、ドメインユーザーに匿名アクセスを割り当てました。

サイトA(サービス):

<system.serviceModel> 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
     <services> 
      <service behaviorConfiguration="wcfServiceBehaviour" name="MyService"> 
       <endpoint address="" binding="wsHttpBinding" contract="IServiceContract" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="wcfServiceBehaviour"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 

SiteBの(クライアント): - WCFで設定wsHttpBinding

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" /> 
    </client> 
</system.serviceModel> 
+0

こんにちはザビエル、私の謝罪を、私は間違っていました。私は明らかにこのビットを見逃していた。 – Aliostad

答えて

1

あなたは正しいです。ここ

は、設定ビットがあります既定でWindows認証が使用されます。

ここには、WCF - changing endpoint address results in securityexceptionというアイデアがあります。アイデンティティブロックはWindows認証では機能しません。削除するようにしてください。

+0

ヒントをありがとう。アイデンティティブロックを削除しましたが、認証がまだ機能していません。私は変更を反映するために私の質問を編集しました。 –

+1

wsHttpBindingの代わりにNetNamedPipeBindingを使用することを検討しましたか?このバインディングは、同じマシン処理用に安全で最適化されています。それでも外部アクセスを提供する必要がある場合は、wsHttpBindingをそのまま使用することができます(外部ユーザーのために働いていると仮定します)。バインディング名を変更し、http://をnet.pipe://に変更するだけです。 –

+0

それはなぜそれがうまくいかなかったのか説明しませんが、それでも素晴らしい提案です! –

1

SiteBが別のユーザーになりすました場合、コードでimpersonation levelが指定されていますか?

私の推測では、偽装のレベルが十分高いとは限りません。 (委任が最も高く、SiteBが異なるサービスに権限を渡すことができます)。

私は、SiteB偽装コードを修正することで問題を解決できると考えています。

ない場合は、サーバーへの許容偽装レベルを渡してみてください。

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" 
       behaviorConfiguration = "ImpersonationBehavior" /> 
    </client> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="ImpersonationBehavior"> 
        <clientCredentials> 
         <windows allowedImpersonationLevel = "Delegation" /> <!-- The highest level --> 
        </clientCredentials> 
       </behavior> 
      <endpointBehaviors> 
     </behaviors> 
</system.serviceModel> 
+0

提案していただきありがとうございます。アプリケーションがフォーム認証を使用しているため、この場合偽装が役立つとは思わなかった。私はとにかく匿名ユーザーを偽装することがポイントであったが、それが役に立たなかった場合に備えて試してみました。私はGregの提案を受け取り、NetNamedPipeBindingを使用し、外部ユーザーのためにwsHttpBindingを残します。 –

0

あなたは私のようなセルフホストされたサイトを使用している場合は、(上記のように)この問題を回避する方法を規定することですホスト側とクライアント側の両方で、wsHttpBindingセキュリティーモード= NONEを指定します。両方のクライアントとホスト上で、あなたはこのコードを使用することができ、結合を作成するとき

Dim binding as System.ServiceModel.WSHttpBinding 
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None) 

または

System.ServiceModel.WSHttpBinding binding 
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None); 
関連する問題