WCF ( ВКФ ):Запрос на токен безопасности не может быть удовлетворен из-за сбоя аутентификации
-
08-07-2019 - |
Вопрос
У меня есть две службы 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, тогда вам либо нужно:
- Запустите свой процесс публикации под единым удостоверением Windows, от имени которого вы хотите, чтобы он взаимодействовал с подписчиками.
- Используйте олицетворение в процессе publisher, чтобы изменить контекст безопасности для каждого вызова (смотрите в Идентификатор Windows.Выдавать себя за для получения дополнительной информации)
Прямо сейчас вы технически выполняете # 1, даже если вы думаете, что выполняете # 2, устанавливая свойства имени пользователя / пароля, поскольку они игнорируются.
Наконец, вот несколько хороших документов о том, как настроить ваши привязки для различных типов сценариев проверки подлинности Windows:
- Безопасность транспорта с помощью проверки подлинности Windows
- Безопасность сообщений с помощью клиента Windows
- Безопасность сообщений с помощью клиента Windows без согласования учетных данных
Помимо этого, я не уверен, что еще я могу дать без дополнительной информации от вас.Если вы пересмотрите свой вопрос, чтобы предоставить дополнительную информацию / ответить на некоторые из моих вопросов, я с удовольствием пересмотрю свой ответ, чтобы, надеюсь, сделать его более полезным.