WCF: запрос маркера безопасности не может быть выполнен из-за сбоя аутентификации - PullRequest
3 голосов
/ 28 октября 2009

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

Издатель динамически создает прокси на основе конечной точки. Я настраиваю прокси в коде так:

            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.

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

1 Ответ

16 голосов
/ 29 октября 2009

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

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

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

Если вы планируете использовать безопасность Windows, то вам необходимо:

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

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

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


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

...