К сожалению, WCF не позволяет вам отправлять имя пользователя / пароль по сети в виде простого текста. Вы все еще можете это сделать, но для этого требуется создать пользовательскую привязку, как этот парень сделал здесь . Это означает, что вам придется использовать сертификат для шифрования. Обратите внимание, что это не то же самое, что аутентификация сертификата, так что не запутайтесь в этом отношении. Все это означает, что вы должны установить сертификат, который предоставляет открытый ключ. Итак, ваш серверный конфиг будет выглядеть так:
<bindings>
<wsHttpBinding>
<binding name="CustomAuthentication">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
...
<serviceBehaviors>
<behavior name="CustomPasswordAuthentication">
<serviceMetadata httpGetEnabled="true" httpGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="MyCertificateName" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="Root" />
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyCompany.WebServices.CustomUsernamePasswordValidator, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
Конец клиента:
client.ClientCredentials.UserName.UserName = "hello";
client.ClientCredentials.UserName.Password = "hello";
client.ClientCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
client.Open();
Надеюсь, это поможет. РЕДАКТИРОВАТЬ: Просто измените wsHttpBinding на TCP или что вы используете.