Serviço WCF auto-hospedado com SSL mútuo (entre serviço e cliente) falha com 403 Proibido

Estou tentando configurar uma demonstração do SSL mútuo entre umauto-hospedado Serviço WCF e um aplicativo cliente (prompt de comando por enquanto). No final, estou tentando chegar a uma solução em que tenhosegurança de transporte (não segurança de mensagens) entre um servidor que usa um certificado para suas conexões de entrada e vários clientes, cada um com certificados individuais que eu posso usar para identificar exclusivamente cada um dos clientes.

Eu tentei várias abordagens diferentes para isso, mas nenhuma funcionou (não consegui encontrar um exemplo exato para o que estou tentando fazer). Cada vez que acho que estou chegando, acabo com uma exceção no cliente quando tento invocar o serviço. A exceção mais comum em que me deparei é:

“The HTTP request was forbidden with client authentication scheme 'Anonymous'.”
Inner exception: "The remote server returned an error: (403) Forbidden."

Alguém tem alguma opinião sobre o que eu poderia ter feito de errado ou talvez uma melhor maneira de configurar o SSL mútuo no cenário acima?

Divulgação completa - no momento, estou executando o cliente e o servidor no mesmo computador. Não tenho certeza se isso importa.

Snippets de configuração abaixo

O código do serviço e do cliente é relativamente trivial, por isso estou bastante confiante de que fiz com que eles funcionassem. As configurações do aplicativo (especificamente as ligações e os comportamentos) e os certificados são "mais interessantes", por isso não estou tão confiante lá.

Como eu criei os certificados (comandos reais literalmente)

makecert -pe -n "CN=SelfSignedCA" -ss Root -sr LocalMachine  -a sha1 -sky signature -r -sv "SelfSignedCA.cer" "SelfSignedCA.pvk"
makecert -pe -n "CN=system" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1  -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Service.cer
makecert -pe -n "CN=client1" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1  -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Client1.cer

Associando o Cert à porta (comandos reais literalmente)

netsh http add urlacl url=https://+:44355/MyService/ user=EVERYONE

Configurações do servidor

Ligações:

  <wsHttpBinding>
    <binding name="CustomBinding">      
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>

Comportamentos:

    <serviceBehaviors>
      <behavior name="">
      <!--
      <serviceCredentials>
        <serviceCertificate
           findValue="system"
           storeLocation="LocalMachine"
           storeName="My"
           x509FindType="FindBySubjectName"/>
      </serviceCredentials>
      -->
      <serviceAuthorization
         serviceAuthorizationManagerType=
              "ClientAuthorization.ClientCertificateAuthorizationManager, Simulator.Service.SideA" />
    </behavior>
  </serviceBehaviors>

Cliente

Ligações:

  <wsHttpBinding>
    <binding name="CustomBinding">      
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>

Comportamentos

  <endpointBehaviors>
    <behavior name="ChannelManagerBehavior">
      <clientCredentials>
         <clientCertificate findValue="client1"
                           storeLocation="LocalMachine"
                           storeName="My"
                           x509FindType="FindBySubjectName" />
        <!--
        <serviceCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust"/>
        </serviceCertificate>
        -->
      </clientCredentials>
     </behavior>
  </endpointBehaviors>

ATUALIZAR

Portanto, adicionei um validador de nome de usuário e senha personalizado ao servidor, na tentativa de substituir o comportamento padrão e sempre permitir, independentemente das credenciais apresentadas (novamente, eu realmente não quero validação de nome de usuário / senha).Este validador nunca é chamado. O cliente ainda recebe a exceção "esquema de autenticação 'Anônimo'."

Atualização de comportamento do serviço

  <serviceCredentials>
    <userNameAuthentication 
      userNamePasswordValidationMode="Custom"
      customUserNamePasswordValidatorType=
        "Service.ClientAuthorization.ClientUserNamePasswordValidatorManager, Service.SideA" />
  </serviceCredentials>

questionAnswers(5)

yourAnswerToTheQuestion