Мы используем 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 мы выбираем.
- Transport - XML не содержит никакой информации о безопасности
- TransportCredentialOnly - полученная ошибка гласит, что конечная точка не может быть https://
- TransportWithMessagecredential - здесь не используется дайджест
Теперь их ServiceReference позволяет нам использовать класс ClientCredentialsИтак, вот как мы пытались использовать HttpDigest:
typeClient.ClientCredentials.HttpDigest.ClientCredential.UserName = "username";
typeClient.ClientCredentials.HttpDigest.ClientCredential.Password = "password";
Я прочитал другой вопрос StackOverflow, что для дайджеста мы должны использовать SoapHeader с AuthHeader, но у нас нет способа сопоставить его с тем, чтоони дают это в API.Есть ли другой способ сделать это?Или их API написан неправильно для C #?