Подключение к SAP Web Служба из приложения C # .NET

Я написал приложение 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 ищут в хранилище сертификатов. SAPX509Assertion делает следующее: -

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;  
} 

Обновление Я могу подключиться к веб-службе через 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 ищут в хранилище сертификатов. SAPX509Assertion делает следующее: -

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;  
} 

Обновление Я могу подключиться к веб-службе через 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 ищут в хранилище сертификатов. SAPX509Assertion делает следующее: -

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;

, который возвращал аналогичную ошибку.

Есть ли у кого-нибудь дополнительные предложения или идеи о том, где я ошибаюсь?

7
задан grimorde 15 October 2010 в 07:02
поделиться