WCF с NTLM через HTTPS и сертификатами для сообщения?

Я хочу настроить службу WCF, которая использует проверку подлинности NTLM через HTTPS и использует безопасность сертификата для сообщения (я знаю, обычно HTTPS отменяет необходимость в шифровании сообщений)

У меня есть сертификаты, работающие над безопасностью сообщений, но когда я пытаюсь использовать TransportWithMessageCredential, клиент выдает исключение:

Необработанное исключение: System.ServiceModel.Security.MessageSecurityException: HTTP-запрос неавторизован со схемой проверки подлинности клиента «Анонимный». Заголовок аутентификации, полученный от сервера, был «Negotiate, NTLM».

IIS настроен для поддержки только Windows Auth, Require SSL и Accept Client Certificates, машины находятся в одном домене Active Directory (на самом деле, я запускаю его локально прямо сейчас)

Есть идеи, что я делаю не так?

Моя служба web.config выглядит так:

<services>
    <service name="ServiceHost.MyTestService" behaviorConfiguration="CertificateServiceBehavior">
        <endpoint address="" binding="ws2007HttpBinding" contract="SharedLibrary.ITestService" bindingConfiguration="CertificateBindingConfig">
        </endpoint>
    </service>
</services>

<bindings>
    <ws2007HttpBinding>
        <binding name="CertificateBindingConfig">
            <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="Windows" />
                <message clientCredentialType="Certificate" negotiateServiceCredential="true" />
            </security>
        </binding>
    </ws2007HttpBinding>
</bindings>

<behaviors>
    <serviceBehaviors>
        <behavior name="CertificateServiceBehavior">
            <serviceCredentials>
                <windowsAuthentication allowAnonymousLogons="false" />
                <clientCertificate>
                    <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="LocalMachine" />
                </clientCertificate>
                <serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="server" />
            </serviceCredentials>
        </behavior>
    </serviceBehaviors>
</behaviors>

Мои клиенты app.config это:

<client>
    <endpoint address="https://server:9999/ServiceHost/TestService.svc" binding="ws2007HttpBinding"
                contract="SharedLibrary.ITestService" bindingConfiguration="CertificateBindingConfig" 
                behaviorConfiguration="CertificateEndpointBehavior"
                name="serviceEndpoint">

    </endpoint>
</client>
<bindings>
    <ws2007HttpBinding>
        <binding name="CertificateBindingConfig">
            <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="Windows" />
                <message clientCredentialType="Certificate" negotiateServiceCredential="true"/>
            </security>
        </binding>
    </ws2007HttpBinding>
</bindings>
<behaviors>
    <endpointBehaviors>
        <behavior name="CertificateEndpointBehavior">
            <clientCredentials>
                <windows allowNtlm="true" allowedImpersonationLevel="Impersonation"/>
                <clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="client"/>
                <serviceCertificate>
                    <authentication certificateValidationMode="PeerTrust"/>
                </serviceCertificate>
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>

person Michael Stum    schedule 22.09.2012    source источник
comment
Я предполагаю, что ваш сертификат клиента зарегистрирован в доверенных сертификатах клиента?   -  person M.Babcock    schedule 22.09.2012
comment
@ M.Babcock Да, это в магазине проверенных людей. Это работает, если я использую защиту сообщений от неаутентифицированной конечной точки HTTP.   -  person Michael Stum    schedule 24.09.2012
comment
Вы используете localhost в адресе конечной точки?   -  person Grzegorz W    schedule 24.09.2012
comment
@GrzegorzWilczura Пробовал как localhost, так и имя моей машины   -  person Michael Stum    schedule 24.09.2012
comment
В настройках проверки подлинности IIS для проверки подлинности Windows. Когда вы щелкаете правой кнопкой мыши и выбираете Providers, это так же просто, как удаление Negotiate из списка поставщиков? Анонимная аутентификация также отключена в IIS?   -  person Aran Mulholland    schedule 25.09.2012


Ответы (1)


Предопределенные режимы не позволят вам достичь такой безопасности. TransportWithMessageCredentials означает:

  • HTTPS
  • Нет транспортных аутентификаций
  • Маркер безопасности в сообщении для аутентификации клиента
  • Нет шифрования сообщений

Попробуйте это (не проверено), чтобы получить HTTPS с NTLM + взаимной безопасностью сообщений:

<bindings>
  <customBinding>
    <binding name="MegaSecurity">
      <security authenticationMode="MutualCertificate"
                messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"
                includeTimestamp="true" />
      <textMessageEncoding messageVersion="Soap12WSAddressing10" />
      <httpsTransport authenticationScheme="Ntlm" />
    </binding>
  </customBinding>
</bindings>

Вы также можете попробовать MutualSslNegotiated режим аутентификации для согласования учетных данных службы и Negotiate в authenticationScheme для лучшего соответствия Windows параметру из предопределенных привязок.

person Ladislav Mrnka    schedule 25.09.2012