Consumindo um serviço da Web usando autenticação Digest
Estamos usando C # para enviar dados XML via SOAP. O serviço requer autenticação HttpDigest com#PasswordDigest
e#Base64Binary Nonce
. Nossobinding
code:
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}},
};
Estamos com três problemas diferentes, com base no tipo de BasicHttpSecurityMode que estamos escolhend
Transport - O XML não inclui nenhuma informação de segurançaTransportCredentialOnly - O erro que obtemos indica que o terminal não pode ser https: //TransportWithMessagecredential - isso não está usando digestAgora, o ServiceReference deles nos permite usar a classe ClientCredentials, então aqui está como tentamos usar o HttpDigest:
typeClient.ClientCredentials.HttpDigest.ClientCredential.UserName = "username";
typeClient.ClientCredentials.HttpDigest.ClientCredential.Password = "password";
Eu li em outra pergunta do StackOverflow que, para digerir, deveríamos usar o SoapHeader com o AuthHeader, mas não há como corresponder ao que eles fornecem na API. Existe alguma outra maneira de fazer isso? Ou a API deles não está escrita corretamente para C #?