Имя пользователя подтверждено пользователем. Это делается классом FarmService.Authentication.DistributorValidator в сборке FarmService. Этот класс наследует от класса WCF UserNamePasswordValidator и переопределяет метод Validate.
public class DistributorValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
throw new SecurityTokenException("Username and password required");
var repository = new DistributorRepository();
if (! repository.IsKnownDistributor(userName, password))
throw new FaultException(string.Format("Wrong username ({0}) or password ", userName));
}
}
За исключением одной детали, которая абсолютно необходима. Для проверки подлинности по имени пользователя на вашем сервере, на котором размещена служба, требуется сертификат X509. В противном случае все сервисные вызовы не будут выполнены. Этот сертификат указан в поведении службы.
<serviceCertificate findValue="Farm" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
Сначала вам нужен сертификат. Вместо покупки одного (который привязан к определенному адресу сервера и, следовательно, бесполезен для тестирования), вы можете создать свой собственный. .NET Framework поставляется с инструментами для их создания, и есть несколько руководств по использованию этих инструментов. Гораздо проще сделать самообслуживание универсальным инструментом, который позаботится обо всем процессе за пару кликов.
Здесь вам не говорят о том, что вы должны запускать инструмент от имени администратора, иначе он выйдет из строя наиболее неблагодарно. То, что инструмент также неясно, где хранить сгенерированный сертификат. По умолчанию он хранится в MyStore. При проверке сертификата его надежность зависит от места его хранения. Когда хранилище не является доверенным, запускается цепочка проверки. Вместо настройки цепочки сертификатов вы также можете напрямую хранить свой сертификат в надежном хранилище.
Чтобы воспользоваться этой услугой, добавьте ссылку на службу в клиенте. MexHttpBinding в конфигурации сервиса позволяет читать все метаданные из сервиса без каких-либо учетных данных.
Настройка соединения с клиентом требует некоторых хлопот. Опять же, не все эти настройки по умолчанию сброшены.
var endPoint = new EndpointAddress(new Uri(Farm.FarmUrl), EndpointIdentity.CreateDnsIdentity("Farm"));
var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
var result = new CustomerDeskOperationsClient(binding, endPoint);
result.ClientCredentials.UserName.UserName = Farm.FarmUserName;
result.ClientCredentials.UserName.Password = Farm.FarmPassword;
Подробности могут относиться к Простой сервис WCF с аутентификацией по имени пользователя по паролю
Надеюсь, это поможет!