Использование веб-службы с использованием дайджест-проверки подлинности - PullRequest
0 голосов
/ 13 марта 2012

Мы используем C # для отправки данных XML через SOAP.Служба требует аутентификации HttpDigest с #PasswordDigest и #Base64Binary Nonce.Наш binding код:

protected BasicHttpBinding binding = new BasicHttpBinding()
{
            Name = "ShipmentServiceSoapBinding",
            CloseTimeout = new TimeSpan(0, 01, 0),
            OpenTimeout = new TimeSpan(0, 01, 0),
            ReceiveTimeout = new TimeSpan(0, 10, 0),
            SendTimeout = new TimeSpan(0, 5, 0),
            AllowCookies = false,
            BypassProxyOnLocal = false, 
            HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
            MaxBufferPoolSize = 5242880,
            MaxReceivedMessageSize = 655360,
            MessageEncoding = WSMessageEncoding.Text ,
            TextEncoding =  new UTF8Encoding(),
            UseDefaultWebProxy = true,
            ReaderQuotas = new XmlDictionaryReaderQuotas() { MaxDepth = 32, MaxStringContentLength = 81920, MaxArrayLength = 1638400, MaxBytesPerRead = 409600, MaxNameTableCharCount = 163840 },
            Security = new BasicHttpSecurity() { Mode = BasicHttpSecurityMode.TransportWithMessageCredential, 
                                                 //Message = new BasicHttpMessageSecurity() { AlgorithmSuite = SecurityAlgorithmSuite.Default, ClientCredentialType = BasicHttpMessageCredentialType.UserName}, 
                                                 Transport = new HttpTransportSecurity(){ ClientCredentialType = HttpClientCredentialType.Digest}},

};

Мы сталкиваемся с 3 различными проблемами в зависимости от того, какой тип BasicHttpSecurityMode мы выбираем.

  1. Transport - XML ​​не содержит никакой информации о безопасности
  2. TransportCredentialOnly - полученная ошибка гласит, что конечная точка не может быть https://
  3. TransportWithMessagecredential - здесь не используется дайджест

Теперь их ServiceReference позволяет нам использовать класс ClientCredentialsИтак, вот как мы пытались использовать HttpDigest:

typeClient.ClientCredentials.HttpDigest.ClientCredential.UserName = "username";
typeClient.ClientCredentials.HttpDigest.ClientCredential.Password = "password";

Я прочитал другой вопрос StackOverflow, что для дайджеста мы должны использовать SoapHeader с AuthHeader, но у нас нет способа сопоставить его с тем, чтоони дают это в API.Есть ли другой способ сделать это?Или их API написан неправильно для C #?

...