从C#.NET应用程序连接到SAP Web服务

我编写了一个Windows应用程序来测试与客户端SAP Web服务的连接。 Web服务调用需要X509证书安全性。

在阅读了互联网上的各种文章后,我想出了三种方法将X509证书附加到Web服务调用中。 不幸的是,所有这些尝试都会返回“401未授权访问”。 但是,我可以通过IE中的URL连接到Web服务。

有没有人对我可能做错的事有什么要求? 我正在使用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;  
} 

更新 OK,我现在有一个WCF调用。 我无法使用Eugarps显示的BasicHttpBinding方法,因为它抱怨说我正在连接到一个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 Web服务。 我收到的错误是“HTTP请求未经客户端身份验证方案'协商'”。 我也尝试过使用

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

它返回了一个类似的错误。

有没有人有任何进一步的建议或想法,我哪里去错了?


现在,这全部来自我自己的经验,所以其中一些可能是错误的,但这里是我理解流程的过程(我没有收到任何文档,在我开始实施之前,我的公司没有经验调用SAP)。

SAP WS调用仅受WCF BasicHttpBinding支持,并且据我所知,只能使用纯文本凭据。 这意味着如果您需要使通信保密(Intranet外部,或Intranet内的敏感数据),您将需要使用IPSec或HTTPS。 我们的SAP服务器没有配置HTTPS,但我们使用VPN与IPSec进行外部通信。 需要注意的是,默认情况下,SAP GUI也不会使通信保密。 在这种情况下,通过使用下面详细介绍的方法,您比使用GUI 7.1查找敏感数据的商业用户更加安全。 以下是我如何在内部连接到我们的SAP服务器:

        //Create binding
        //Note, this is not secure but it's not up to us to decide. This should only ever be run within
        //the VPN or Intranet where IPSec is active. If SAP is ever directly from outside the network,
        //credentials and messages will not be private.
        var binding = new BasicHttpBinding();
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;

        //Assign address
        var address = new EndpointAddress(Host);

        //Create service client
        var client = new SAP_RFC_READ_TABLE.RFC_READ_TABLEPortTypeClient(binding, address);

        //Assign credentials
        client.ClientCredentials.UserName.UserName = User;
        client.ClientCredentials.UserName.Password = Password;

就我所能确定的,不支持消息级安全性,并且不支持basicHttpBinding(SOAP 1.1)以外的绑定。

正如我所说的,这些都来自经验,而不是来自培训,所以如果有人可以通过评论添加一些内容,请这样做。


我遇到了同样的问题,看起来我已经在这里找到了解决方法:http://ddkonline.blogspot.com/2009/08/calling-sap-pi-web-service-using-wcf.html。

        CustomBinding binding = new CustomBinding();
        binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
        HttpsTransportBindingElement transport = new HttpsTransportBindingElement();
        transport.AuthenticationScheme = AuthenticationSchemes.Basic;
        //transport.ProxyAuthenticationScheme = AuthenticationSchemes.Basic;
        transport.Realm = "XISOAPApps";
        binding.Elements.Add(transport);
        var address = new EndpointAddress("https://foooo");
        ........ create client proxy class


        service.ClientCredentials.UserName.UserName = "<login>";
        service.ClientCredentials.UserName.Password = "<password>";

不幸的是,我无法在我的应用程序中使用WCF,我必须坚持使用.NET 2.0和WSE 3.0,并且如果有人能够找到解决方案,我该如何做?


毕竟这个时候,客户终于找到了一个人来处理SAP的问题。 发现我们提供的WSDL文件不正确,认证错误。 我用新的WSDL文件重新编写了代码,并且它第一次运行。

链接地址: http://www.djcxy.com/p/2817.html

上一篇: Connecting to SAP Web Service from C# .NET application

下一篇: JQuery Validate individual fieldsets