我编写了一个Windows应用程序来测试与客户端SAP Web服务的连接。 Web服务调用需要X509证书安全性。
在互联网上阅读各种文章之后,我想出了三种方法将X509证书附加到网络服务电话上。不幸的是,所有这些尝试都返回'401 Unauthorized Access'。但是,我可以通过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;
}
更新 好的,我现在有一个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;
返回了类似的错误。
是否有人对我出错的地方有任何进一步的建议或想法?
答案 0 :(得分:4)
现在,这一切都来自我自己的经验,所以有些可能是错的,但这是我理解这个过程的方式(我没有收到任何文档,我的公司在开始这样做之前没有调用SAP的经验)。 / p>
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)以外的绑定。
正如我所说,这完全取决于经验而非培训,所以如果有人可以通过评论添加内容,请这样做。
答案 1 :(得分:2)
我遇到了同样的问题,似乎我在这里找到了溶剂: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,如果有人能够找到解决方案,我会更加干净吗?
答案 2 :(得分:-2)
您的证书是否恰好映射到用户商店中的有效用户?
答案 3 :(得分:-2)
在这段时间之后,客户终于找到了某人从他们的SAP结束处理问题。结果证明我们提供的WSDL文件不正确并且认证错误。我用新的WSDL文件重新编写代码,并且它第一次工作。