web-dev-qa-db-ja.com

IISホストされたWCFサービス+ Windows認証IIS + TransportCredentialOnly / basicHttpBindingのWindows認証

IIS6でホストされるWCFサービスを作成し、IISで匿名認証を無効にしたいのですが。また、SSLは使用しないでください。

だから私が持っている唯一の方法は、basicHttpBingingをTransportCredentialOnlyで使用することですよね。

仮想ディレクトリを作成し、Windows統合認証を設定して、[匿名アクセスを有効にする]をオフにします。

これが私のweb.configです:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MyBinding">
                    <security mode="TransportCredentialOnly">
                        <transport clientCredentialType="Windows" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <services>
            <service name="Samples.ServiceFacadeService" behaviorConfiguration="ServiceFacadeServiceBehavior">
                <endpoint address="" binding="basicHttpBinding" bindingName="MyBinding"
                          contract="Samples.IServiceFacadeService">
                </endpoint>
            </service>
        </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceFacadeServiceBehavior">
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

メタデータ交換用のMEX-enpointも含めていないことがわかります。 TransportCredentialOnlyセキュリティーを使用して、1つのエンドポイントとその1つのバインディングのみ。

しかし、サービスを開始しようとすると(クライアントプロキシを介してメソッドを呼び出す)、EventLogに次のような例外が発生しました。

例外:System.ServiceModel.ServiceActivationException:コンパイル中の例外のため、サービス '/wcftest/ServiceFacadeService.svc'をアクティブ化できません。例外メッセージは次のとおりです:このサービスのセキュリティ設定には「匿名」認証が必要ですが、IISこのサービスをホストするアプリケーションでは有効ではありません。---> System.NotSupportedException:のセキュリティ設定このサービスには「匿名」認証が必要ですが、このサービスをホストするIISアプリケーションでは有効ではありません。

私のサービスが匿名認証を必要とする理由がわかりません。どうして?

21
Shrike

答えはjezellでした。ありがとう。 bindingNameとbindingConfigurationを混同しました:

<endpoint address="" binding="basicHttpBinding" bindingName="MyBinding"
          contract="Samples.IServiceFacadeService">
</endpoint>

そのとおり:

<endpoint address="" binding="basicHttpBinding" **bindingConfiguration**="MyBinding"
          contract="Samples.IServiceFacadeService">
</endpoint>
8
Shrike

MEXエンドポイントがまだ問題である可能性があります(これを参照してください post )。次のようにMEXを無効にしてみてください。

<services>
    <!-- Note: the service name must match the configuration name for the service implementation. -->
    <service name="MyNamespace.MyServiceType" behaviorConfiguration="MyServiceTypeBehaviors" >
        <!-- Add the following endpoint.  -->
        <!-- Note: your service must have an http base address to add this endpoint. -->
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
    </service>
</services>

<behaviors>
    <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <!-- This disables it. -->
            <serviceMetadata httpGetEnabled="false" />
        </behavior>
    </serviceBehaviors>
</behaviors>

これは、MEXのセキュリティ保護に役立つ post です。

7
Sixto Saez

MexエンドポイントにbasicHttpBindingを使用して、同じbindingConfigurationを適用します。

3
Kay Khan

VS wcfサービスプロジェクト(新しいサンプルプロジェクト)をIISの認証で機能させるには、次のことを行う必要があります。

1)IISで匿名アクセスを許可する
2)次のような属性をパブリックメソッドにプレフィックスします。

[PrincipalPermission(SecurityAction.Demand, Role = "MyADGroup")]
public string SendMyMessage(string Message)
{...}
1
wcfdude