WCF wsdualhttpBinding пользовательское имя - PullRequest
0 голосов
/ 05 мая 2011

Я получил очень досадную ошибку: Мой сценарий - простой сервер сообщений / почты \ клиент, реализованный в WCF с wsdualhttpbinding (двойная функция для обратных вызовов, онлайн-обновление для нового сообщения).код (нет * .config вообще).При первом подключении клиент выбрасывает следующее [System.Security.Cryptography.CryptographicException] = {"Bad Length. \ R \ n"} с внутренним исключением NULL, поэтому углубленное углубление невозможно.Конфигурация сервера:

     WSDualHttpBinding binding = new   WSDualHttpBinding(WSDualHttpSecurityMode.Message);
    binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

        Uri baseServiceAddress = new Uri(@"http://"+Environment.MachineName+":7921/Mail/");                 
        host = new ServiceHost(theMightyMailServer,baseServiceAddress);             

        host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
        host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
        host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = validator;
        host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.Root, X509FindType.FindByIssuerName, "MailServer");
        ServiceDebugBehavior d = new ServiceDebugBehavior();
        d.IncludeExceptionDetailInFaults = true;
        host.Description.Behaviors.Remove<ServiceDebugBehavior>();
        host.Description.Behaviors.Add(d);
        ServiceMetadataBehavior b = new ServiceMetadataBehavior();
        b.HttpGetEnabled = true;
        host.Description.Behaviors.Remove<ServiceMetadataBehavior>();
        host.Description.Behaviors.Add(b);
        var mexBinding = MetadataExchangeBindings.CreateMexHttpBinding();
        host.AddServiceEndpoint(typeof(IMailServer), binding, "Service");
        host.AddServiceEndpoint(typeof(IMetadataExchange),mexBinding,"");


        host.Open();

Конфигурация клиента:

           client = new MailServerReference.MailServerClient(new InstanceContext(this));

            client.ClientCredentials.UserName.UserName = currentUser.UserName;
            client.ClientCredentials.UserName.Password = currentUser.Password;
                client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
            client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.Root,X509FindType.FindByIssuerName, "MailServer");
            currentUser.ID = client.getUID();
            client.RegisterOnServer(currentUser.ID);
            return true;

        }
        catch (Exception ex) { MessageBox.Show(ex.Message); return false; }

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 05 мая 2011

Я бы попробовал установить для ServiceCertificate и ClientCertificate одно и то же на клиенте и на сервере. По крайней мере, так я это сделал. Это было какое-то время, но я думаю, что у меня были проблемы, когда был установлен только один сертификат или другой, а не оба.


Изменить для получения дополнительной информации:

В моем случае я использую CustomBinding вместо WSDualHttpBinding, но в итоге я использовал один и тот же сертификат для ServiceCertificate и ClientCertificate с обеих сторон (клиент и сервер).

Точнее, у меня есть класс, который расширяет System.ServiceModel.Description.ServiceCredentials

public class MyServiceCredentials : ServiceCredentials
{
    public MyServiceCredentials() : base()
    {
        LoadCertificate();
    }

    public MyServiceCredentials(MyServiceCredentials other) : base(other)
    {
        LoadCertificate();
    }

    private void LoadCertificate()
    {
        ServiceCertificate.Certificate = _cert;
        ClientCertificate.Certificate = _cert;
        ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
        ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
   }
}

И я передаю один из них моему конструктору CustomBinding в реализации клиента и сервера.

В любом случае, я думаю, что поскольку для привязки включена защита Message, она ожидает, что в обоих направлениях будет защита на уровне сообщений, поэтому для нее требуется сертификат с обеих сторон (ServiceCertificate и ClientCertificate).

Хотя я могу быть совершенно неправ, я просто говорю; попробуйте и посмотрите, поможет ли это ...

...