Я написал приложение для Windows, чтобы проверить соединение с клиентскими веб-сервисами SAP. Для вызова веб-службы требуется сертификат X509.
После прочтения различных статей в Интернете я нашел три способа прикрепить сертификат X509 к вызову веб-службы. К сожалению, все эти попытки возвращают «401 Несанкционированный доступ». Однако я могу подключиться к веб-сервису через URL в IE.
У кого-нибудь есть предположения относительно того, что я могу делать неправильно? Я использую WSE 3.0 и три метода, которые я использую для прикрепления сертификата, следующие: -
Сертификат
X509Certificate2 oCert = GetSecurityCertificate(oCertificate);
svc.ClientCertificates.Add(oCert);
Жетон
X509SecurityToken oToken = GetSecurityToken(oCertificate);
svc.RequestSoapContext.Security.Tokens.Add(oToken);
Политика
SAPX509Assertion sapX509Assertion = new SAPX509Assertion(oCertificate, oStoreLocation, oStoreName, oFindType);
svc.SetPolicy(sapX509Assertion.Policy());
GetSecurityToken () и GetSecuirtyCertificate выполняют поиск в хранилище сертификатов. SAPX509 Assertion делает это: -
public SAPX509Assertion(String certSubject, StoreLocation oStoreLocation, StoreName oStoreName, X509FindType oFindType)
{
ClientX509TokenProvider = new X509TokenProvider(oStoreLocation,
oStoreName, certSubject, oFindType);
ServiceX509TokenProvider = new X509TokenProvider(oStoreLocation,
oStoreName, certSubject, oFindType);
Protection.Request.EncryptBody = false;
Protection.Response.EncryptBody = false;
}
Обновление
ОК, у меня сейчас звонок на WCF. Я не мог использовать метод BasicHttpBinding, показанный Eugarps, поскольку он жаловался, что я подключался к адресу https и ожидал http ... что имело смысл. У меня сейчас есть код: -
var binding = new WSHttpBinding();
binding.MaxReceivedMessageSize = int.MaxValue;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
binding.Security.Mode = SecurityMode.Transport;
WCFConnection.CreateAbsenceWSlow.ZWSDHTM_GB_AMS_CREATEABS_lowClient client;
CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabsResponse response;
CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabs data;
//Assign address
var address = new EndpointAddress(sUrl);
//Create service client
client = new CreateAbsenceWSlow.ZWSDHTM_GB_AMS_CREATEABS_lowClient(binding, address);
//Assign credentials
client.ClientCredentials.UserName.UserName = sUserName;
client.ClientCredentials.UserName.Password = sPassword;
response = new CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabsResponse();
data = new WCFConnection.CreateAbsenceWSlow.ZfhhrGbbapiZgeeamsCreateabs();
response = client.ZfhhrGbbapiZgeeamsCreateabs(data);
Все еще не удается подключиться к веб-службе SAP. Я получаю сообщение об ошибке: «HTTP-запрос не авторизован по схеме проверки подлинности клиента« Согласование »». Я также пытался использовать
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
, который возвратил похожую ошибку.
У кого-нибудь есть какие-либо дополнительные предложения или идеи о том, где я иду не так?