0

編集:この質問をちょっと忘れていました!構成を再マッピングすることになり、エラーが消え、理由がわかりませんでした。

IIS でホストされている WCF サービスと、それに接続しようとしている Windows フォーム クライアントがあります。

WCF サービスはセキュリティで保護する必要があるため、IIS Web アプリは、開発環境の "localhost" に対して発行されたドメイン (CA はドメイン上にあります) によって発行された証明書を使用するように構成されています。

IIS の SSL 設定は、「SSL が必要」および「クライアント証明書 = 必要」に設定されています。

WCF サービスはカスタム バインドを使用し、web.config の構成は次のとおりです。

  <diagnostics>
    <messageLogging logEntireMessage="true" logMalformedMessages="true"
      logMessagesAtTransportLevel="true" maxMessagesToLog="25" />
  </diagnostics>
  <services>
    <service behaviorConfiguration="SpecificBehaviorType" name="MyCom.Service">
      <endpoint address="" binding="customBinding" bindingConfiguration="CustomBindingConfiguration" contract="MyCom.IMyService">
        <!--<identity>
          <dns value="localhost" />
        </identity>-->
      </endpoint>
      <!--<host>
        <baseAddresses>
          <add baseAddress="http://localhost:8999/" />
        </baseAddresses>
      </host>-->
    </service>
  </services>
  <bindings>
    <customBinding>
      <binding name="CustomBindingConfiguration">
        <MyComMessageEncoding innerMessageEncoding="textMessageEncoding" />

        <httpsTransport maxReceivedMessageSize="10000000" maxBufferPoolSize="10000000" requireClientCertificate="true" />


      </binding>
    </customBinding>

  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior name="SpecificBehaviorType">
        <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment -->
        <serviceMetadata httpGetEnabled="True"/>
        <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true.  Set to false before deployment 
      to avoid disclosing exception information -->
        <serviceDebug includeExceptionDetailInFaults="True" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

クライアントがサービスに接続できるようにするために、「localhost」証明書を「localhost.cer」ファイルとしてエクスポートし、そのファイルをコードで使用しました (これはクライアント固有の別の信頼できる証明書である必要がありますが、localhost の証明書を使用しています)。テスト目的のため)。クライアントの構成はプログラムで行われます (私の知る限り、ここに特別な理由はありません)。

クライアントコードは次のとおりです。

 Dim isHttps As Boolean = uri.ToLower().StartsWith("https")
        'TODO: set quotas for message size
        Dim binding As New CustomBinding()
        binding.Elements.Add(New MyComEncodingBindingElement(New TextMessageEncodingBindingElement(MessageVersion.Soap12, System.Text.Encoding.UTF8)))
        'TODO: make configurable to support both http and https
        If isHttps Then
            Dim httpsBinding As New HttpsTransportBindingElement

            binding.Elements.Add(httpsBinding)
        Else
            Dim transport As New HttpTransportBindingElement()
            binding.Elements.Add(transport)
        End If

        Dim channelFactory = New ChannelFactory(Of IRequestChannel)(binding, New EndpointAddress(uri))

        channelFactory.Endpoint.Behaviors.Add(New MustUnderstandBehavior(False))

        If isHttps Then
            For counter As Integer = 0 To channelFactory.Endpoint.Behaviors.Count - 1
                If TypeOf channelFactory.Endpoint.Behaviors(counter) Is System.ServiceModel.Description.ClientCredentials Then
                    CType(channelFactory.Endpoint.Behaviors(counter), System.ServiceModel.Description.ClientCredentials).ClientCertificate.Certificate = New X509Certificate2("localhost.cer")
                    Exit For
                End If
            Next

        End If

        channelFactory.Open()
        Dim channel = channelFactory.CreateChannel()
        channel.Open()

問題は、接続を確立しようとすると、「クライアント認証スキーム「匿名」で HTTP 要求が禁止されました」というメッセージが表示されることです。

以下を変更しようとしました:

httpsBinding.AuthenticationScheme

しかし、役に立たない。

私は何が欠けていますか?

4

1 に答える 1

0

IIS クライアント証明書マッピングを構成しようとしましたか? この記事を見て ください http://www.iis.net/configreference/system.webserver/security/authentication/iisclientcertificatemappingauthentication

于 2013-06-17T07:58:51.963 に答える