WCF ( ВКФ ):Запрос на токен безопасности не может быть удовлетворен из-за сбоя аутентификации

StackOverflow https://stackoverflow.com/questions/1639035

Вопрос

У меня есть две службы WCF на одном компьютере.Один из них - издатель, а другой - слушатель.

Издатель динамически создает прокси-серверы на основе конечной точки and.Я настраиваю прокси-сервер в коде, подобном этому:

            WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message, true);
            binding.Security.Message.NegotiateServiceCredential = true;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
            binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
            binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
            binding.Security.Message.EstablishSecurityContext = true;
            binding.ReliableSession.Enabled = true;
            binding.TransactionFlow = true;
            return binding;

а потом...

            Binding binding = GetBindingFromAddress(address);

            ChannelFactory<T> factory = new ChannelFactory<T>(binding);
            factory.Credentials.UserName.UserName = "an account on the machine";
            factory.Credentials.UserName.Password = "a password for that account";

            T proxy = factory.CreateChannel(new EndpointAddress(address));

Когда я иду звонить, я получаю вышеуказанную ошибку.Вот мой конфигурационный файл слушателя:

   <service behaviorConfiguration="MEX Enabled" name="InvoiceSubscriber">
<endpoint binding="wsHttpBinding"
          bindingConfiguration="ReliableTransactionalHTTP"
          contract="AtlanticBT.SubscriptionService.Contracts.v1.IAtlanticEvents">
 <identity>
  <dns value="localhost" />
 </identity>
</endpoint>

        <bindings>
        <wsHttpBinding>
            <binding name="ReliableTransactionalHTTP" transactionFlow="true">
                <reliableSession enabled="true"/>
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
                 algorithmSuite="Default" establishSecurityContext="true"/>
      </security>
            </binding>
  </wsHttpBinding>
    </bindings>

Я проверил все свои ACL в каталогах, в которых размещены службы, и они кажутся правильными.Безопасность IIS настроена на анонимный доступ и проверку подлинности Windows.

Итак, если я явно устанавливаю учетные данные в коде, почему мой слушатель не может пройти аутентификацию?

Это было полезно?

Решение

Во-первых, это сообщение обычно означает, что компьютеры не находятся в одном домене и, следовательно, не могут обмениваться данными с использованием системы безопасности Windows.Находятся ли эти два сервера в одном домене?

Во-вторых, вы настроили свою конечную точку на использование системы безопасности Windows.Вы используете безопасность Windows не только на уровне сообщений, но и на транспортном уровне.И то, и другое кажется излишеством, вы, вероятно, просто хотите заняться транспортом.

В-третьих, все, что вы настроили, говорит "я хочу использовать проверку подлинности Windows", но затем вы устанавливаете свойства UsernameClientCredentials ClientCredentials.Эти свойства используются только для защиты токена имени пользователя, а не Windows.Служба безопасности Windows возьмет идентификатор текущего потока и перешлет его дальше.

Предполагая, что вашим намерением было использовать Windows Security, тогда вам либо нужно:

  1. Запустите свой процесс публикации под единым удостоверением Windows, от имени которого вы хотите, чтобы он взаимодействовал с подписчиками.
  2. Используйте олицетворение в процессе publisher, чтобы изменить контекст безопасности для каждого вызова (смотрите в Идентификатор Windows.Выдавать себя за для получения дополнительной информации)

Прямо сейчас вы технически выполняете # 1, даже если вы думаете, что выполняете # 2, устанавливая свойства имени пользователя / пароля, поскольку они игнорируются.

Наконец, вот несколько хороших документов о том, как настроить ваши привязки для различных типов сценариев проверки подлинности Windows:


Помимо этого, я не уверен, что еще я могу дать без дополнительной информации от вас.Если вы пересмотрите свой вопрос, чтобы предоставить дополнительную информацию / ответить на некоторые из моих вопросов, я с удовольствием пересмотрю свой ответ, чтобы, надеюсь, сделать его более полезным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top