2015-05-20 9 views
0

У нас есть приложение с несколькими модулями, которые соединяются друг с другом с помощью WCF. Мы настроили их на использование NetTcpBinding (ниже - часть кода, ответственного за настройку). И клиентская, и серверная часть имеют аналогичные настройки, и все работает хорошо.WCF отправляет запросы Kerberos контроллеру домена при использовании сертификатов и Transport SecurityMode

За исключением того, что всякий раз, когда клиент отправляет запрос на сервер, есть дополнительный запрос к контроллеру домена нашей компании для Kerberos TGT. Это запрос типа AS-REQ с именем NT-X500-PRINCIPAL типа name, а имя - предмет сертификата (сертификат, используемый для шифрования соединения). В качестве ответа мы получаем ошибку ERR_C_PRINCIPAL_UNKNOWN.

Это не проблема для нашего приложения, но поскольку мы выполняем довольно много запросов, мы наводняем журналы на контроллере домена. Есть ли способ предотвратить отправку системы выше запросов Kerberos?

Связывание конфигурации:

var binding = new NetTcpBinding 
{ 
    MaxBufferSize = 5000000, 
    (...) 
}; 


binding.Security.Mode = SecurityMode.Transport; 
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; 
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; 
(...) 

channelFactory.Credentials.ClientCertificate.SetCertificate(
     StoreLocation.LocalMachine, 
     StoreName.My, 
     X509FindType.FindBySubjectDistinguishedName, 
     certificateSubject); 
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.ChainTrust; 
channelFactory.Credentials.ServiceCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine; 
channelFactory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck; 
+0

привет, можете ли вы добавить файлы app.config? также полезно знать, если это анонимное клиентское соединение, или если оба используют сертификаты для авторизации. клиент подключается к CD или серверу или к тому и другому? –

+0

Чтобы уточнить клиент и сервер, оба находятся на одной машине. И в файле .config есть только таймауты (мы все равно их переписываем в код). Вся конфигурация безопасности находится в коде. Оба они используют сертификаты для авторизации. Я не знаю, кто подключается к CD, так как оба процесса находятся на одной машине. – mironiasty

+0

ах ок. почему вы используете сертификаты для авторизации, если оба партнера работают на одном компьютере? Можете ли вы просто перекрестно-машинное общение, так что вы можете видеть, какой из них подключается к DC? –

ответ

0

Оказывается, что запросы Kerberos были вызваны этой линии:

binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; 

Если оно было изменено на None, то запросы исчезают (и эта линия не требуется в нашем случае).