Ich habe eine Windows-Anwendung geschrieben, um eine Verbindung zu einem Client SAP Web Services zu testen. Der Web-Service-Aufruf erfordert die Sicherheit des X509-Zertifikats.Verbinden mit SAP Web Service von C# .NET-Anwendung
Nach dem Lesen verschiedener Artikel im Internet habe ich drei Möglichkeiten gefunden, um das X509-Zertifikat an den Web-Service-Aufruf anzuhängen. Leider geben alle diese Versuche einen "401 Unauthorized Access" zurück. Ich kann jedoch über die URL in IE eine Verbindung zum Webdienst herstellen.
Hat jemand irgendwelche Behauptungen, was ich falsch machen könnte? Ich bin mit WSE 3.0 und die drei Methoden, die ich um das Zertifikat zu befestigen bin mit lauten wie folgt: -
Zertifikat
X509Certificate2 oCert = GetSecurityCertificate(oCertificate);
svc.ClientCertificates.Add(oCert);
Token
X509SecurityToken oToken = GetSecurityToken(oCertificate);
svc.RequestSoapContext.Security.Tokens.Add(oToken);
Politik
SAPX509Assertion sapX509Assertion = new SAPX509Assertion(oCertificate, oStoreLocation, oStoreName, oFindType);
svc.SetPolicy(sapX509Assertion.Policy());
GetSecurityToken() und GetSecuirtyCertificate durchsuchen beide den Zertifikatsspeicher. Die SAPX509Assertion tut dies: -
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;
}
aktualisiert OK, ich habe jetzt einen WCF-Aufruf an Ort und Stelle. Ich konnte die BasicHttpBinding-Methode, die von Eugarps gezeigt wurde, nicht verwenden, da sie sich beschwerte, dass ich eine Verbindung zu einer https-Adresse herstellte und http erwartete ... was einen Sinn ergab. Der Code, den ich jetzt habe, ist: -
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);
Es ist noch immer keine Verbindung zum SAP-Web-Service. Der Fehler, den ich erhalte, ist "Die HTTP-Anfrage ist nicht autorisiert mit dem Client-Authentifizierungsschema 'Negotiate'". Ich habe auch versucht mit
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
, die einen ähnlichen Fehler zurückgegeben.
Hat jemand weitere Vorschläge oder Ideen, wo ich falsch liege?
'ZfhhrGbbapiZgeeamsCreateabsResponse' ... Meine Augen ... –
Ich weiß! Nicht die benutzerfreundlichste Namenskonvention. – grimorde