WCF The Security Support Provider Interface (SSPI) negotiation failed

I am using a wcf service that I created, when both hosting machine and the client machine are on the same domain everything works just fine. When I publish the client app to the webserver in the DMZ I am getting the following error:

SOAP security negotiation with 'http://10.0.0.14:3790/Bullfrog/QBService/QBService' for   
target 'http://10.0.0.14:3790/Bullfrog/QBService/QBService' failed. See inner exception  
for more details.The Security Support Provider Interface (SSPI) negotiation failed.

Here is my service main where I set up the service

      Uri baseAddress = new Uri("Http://10.0.0.14:3790/Bullfrog/QBService");
      ServiceHost selfHost = new ServiceHost(typeof(QBService), baseAddress);

            try
            {
                selfHost.AddServiceEndpoint(
                    typeof(IQBService),
                    new WSHttpBinding(),
                    "QBService");

                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);
                selfHost.Open();

                Console.WriteLine("The service is ready");


            }
            catch (CommunicationException ce)
            {
                //log.Error(ce.Message, ce);
                Console.WriteLine(ce.Message, ce);
                selfHost.Abort();
            }

and here is the config section on my client

  <system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IQBService" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
          enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
            algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://10.0.0.14:3790/Bullfrog/QBService/QBService"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IQBService"
      contract="IQBService" name="WSHttpBinding_IQBService">
    <identity>
      <userPrincipalName value="Administrator@bullfrogspas.local" />
    </identity>
  </endpoint>
</client>

I am sure the problem is because it is using windows authentication. Any Ideas? Thank You!

9
задан twal 19 August 2010 в 18:23
поделиться

1 ответ

Я не думаю, что это будет работать, и у меня нет среды, чтобы быстро проверить это. SSPI использует NTLM или Kerberos (обязательно, если не используется согласование учетных данных службы) для аутентификации службы на клиенте и клиента на службе. И NTLM, и Kerberos используют один и тот же домен или доверенные домены.

Если вы хотите использовать безопасность сообщений, вы можете изменить конфигурацию на использование сертификатов или имя пользователя + пароль (служба все равно будет требовать сертификат). Вы можете проверить имя пользователя и пароль в active directory или в любом другом хранилище учетных данных.

Помните, что безопасность сообщений является самой медленной. Лучшей производительности можно добиться с помощью транспортной безопасности (HTTPS) - она может быть ускорена сетевыми устройствами. Если вы используете HTTPS, вы можете сочетать его с базовой аутентификацией и предоставлять учетные данные клиента из вашего кода, таким образом, вы будете вызывать сервис в вашей внутренней зоне и использовать учетные данные домена для аутентификации. Служба будет аутентифицирована своим сертификатом, используемым для HTTPS. HTTPS также позволяет аутентификацию по мутальному сертификату, когда клиент посылает сертификат службе - при правильной настройке клиентский сертификат может быть сопоставлен с учетной записью домена. Эти два подхода похожи на упомянутые подходы в безопасности сообщений, но вместо отправки учетных данных в SOAP-заголовке используется HTTP-заголовок.

8
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: