編集:この質問をちょっと忘れていました!構成を再マッピングすることになり、エラーが消え、理由がわかりませんでした。
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
しかし、役に立たない。
私は何が欠けていますか?