1

公開したい非常に単純な WCF サービスがあります。サービスを作成し、手間をかけずにサーバー上にセットアップしました。問題は、プライベート ネットワーク内からサービスを使用できることですが、ネットワークの外部からサービスを使用しようとすると、次のエラーがスローされます。

セキュリティ サポート プロバイダー インターフェイス (SSPI) のネゴシエーションが失敗しました。

少し調べてみたところ、WCF はデフォルトで Windows 認証を使用しているようです。認証を使用しないように変更したいのですが、方法がよくわかりません。これが私の設定が今どのように見えるかです。

<system.serviceModel>
    <services>
        <service behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior"
         name="XX.ZZ.WebService.MyService">
            <endpoint  address="" binding="wsHttpBinding" contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="XX.ZZ.WebService.MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

いくつかの指針、または正しい方向へのナッジをいただければ幸いです。

4

3 に答える 3

6

サービスは wsHttpBinding を使用しますが、これにはデフォルトで Windows ユーザーの資格情報が必要になりますが、これは外部ユーザーには明らかに必要ありません。デフォルトでWindows資格情報を使用するのはWCF自体ではありませんが(あなたが述べているように)、実際にはこの特定のバインディング(wsHttpBinding)-他の設定はデフォルトである可能性があります。

いくつかの選択肢があります。

  • セキュリティをまったく使用しないように、または呼び出し元が提供する必要があるユーザー名/パスワード セキュリティを使用するように、wsHttpBinding (どちらかというと「重い」) を構成します。
  • 代わりに、セキュリティなしで basicHttpBinding を使用します (これは基本的に ASMX モデルです)。

wsHttpBinding からセキュリティを完全にオフにするには、これを構成に含めます。

<bindings>
  <wsHttpBinding>
    <binding name="NoSecurity">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

次に、そのバインディング構成を使用するようにエンドポイントを構成します。

<system.serviceModel>
    <services>
        <service name="XX.ZZ.WebService.MyService"
                 behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior">
           <endpoint address="" 
                     binding="wsHttpBinding" 
                     bindingConfiguration="NoSecurity" 
                     contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>

<basicHttpBinding>必要に応じて、代わりに を使用して同じことを行うこともできます<wsHttpBinding>(セキュリティおよび wsHttpBinding が提供する他のすべての高度な機能をオフにした場合、wsHttpBinding と basicHttpBinding を使用してもメリットはありません)。

また、5 つの異なる典型的なシナリオの観点から WCF セキュリティの基本について説明している、非常に優れたブログ投稿シリーズもあります。

マルク

于 2009-08-05T14:49:57.520 に答える
2

WCF は、構成に関しては本当に面倒です。WCFSecurityを見てみましょう。さまざまな構成環境で適切に機能するサンプルが提供されています。

于 2009-08-05T14:44:50.413 に答える
2

これにより、認証なしでトランスポート レベルのセキュリティが得られます。

<configuration>  <system.serviceModel>
    <services>
      <service 
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1" 
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>  </system.serviceModel>
</configuration>

他のシナリオについては、Microsoft WCF のサンプルを参照してください。

于 2009-08-05T14:56:46.447 に答える