Visual Studio Webservice Client mit BasicAuth (für SAP)

SAP Webservice with .NET Webservice Client and BasicAuthAuch mit SAP lassen sich Webservices aufsetzen. Sogar WSDL-Dateien kann man sich in SAP generieren lassen. Das kam mir gerade recht, als ich die Tage einen Webservice in SAP schreiben sollte, welcher von einem .NET-Programm angesteuert werden soll.

In .NET lassen sich Webservices mittels ihrer WSDL-Datei nämlich sehr angenehm als Webreference einfügen. Das Visual Studio generiert dann eine sogenannte Proxy-Klasse daraus und über diese lässt sich der Webservice dann sehr einfach anprogrammieren.

Soweit in der Theorie. In der Praxis sieht das so aus, dass ich in SAP festlegen musste, wie sich die Nutzer gegenüber dem Webservice authentifizieren sollen. Hier hatte ich mich BasicAuth entschieden. Also eine einfach Authentifizierung mittels Benutzername und Passwort.
Leider hat das Visual Studio das beim Generieren der Proxyklasse nicht so ganz drauf. So bekommt man die freundliche Fehlermeldung

“Die HTTP-Anforderung ist beim Clientauthentifizierungsschema “Anonymous” nicht autorisiert. Vom Server wurde der Authentifizierungsheader “Basic realm=”SAP Web Application Server XYZ”” empfangen.”

entgegen geworfen, wenn man einfach ein Objekt der Proxy-Klasse erstellt und eine Methode aufruft.

SAPwebservice.YS_TEST_SERVICE sapClient = new SAPwebservice.YS_TEST_SERVICE();

sapClient.ClientCredentials.UserName.UserName = "mein_benutzername";
sapClient.ClientCredentials.UserName.Password = "mein_passwort";

int result = sapClient.TestMethode("1234", "Testdaten.Testdaten.Testdaten.");

Dabei hatte ich in weiser Voraussicht sogar schon meinen Benutzernamen und mein Passwort mit übergeben. Und was nun?

Um der generierten Proxyklasse beizubringen, dass Sie BasicAuth als Authentifizierung gegenüber dem SAP-Webservice nutzen soll, ist es nötig, folgende Parameter an den Konstruktor der Klasse zu übergeben.

using System.ServiceModel;
[...]

//Binding von Hand rekonfiguriert für SAP-Basic Auth
BasicHttpBinding basicAuthBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
basicAuthBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
EndpointAddress basicAuthEndpoint = new EndpointAddress("http://mein_sap_server:mein_port/sap/bc/srt/rfc/sap/mein_webservice?sap-client=mein_mandant&wsdl=1.1");

SAPwebservice.YS_TEST_SERVICE sapClient = new SAPwebservice.YS_TEST_SERVICE(basicAuthBinding, basicAuthEndpoint);

Erstellt man das Binding von Hand, was eigentlich auch so klappen sollte, wenn man ein Objekt der Proxy-Klasse erstellt, so kann die Authentifizierungsmethode angeben. Auf diesem Weg hat man die Chance, dem Proxy zu vermitteln, dass er doch auch die ebenfalls von uns gesetzten Credentials (Nutzername/Passwort) benutzt.

So klappt es dann auch mit dem SAP-Webservice mit BasicAuth und dem .NET/C# Webservice Client.

Visual Studio Webservice Client mit BasicAuth (für SAP)Über den Autor: Dieser Artikel, sowie 363 andere Artikel auf code-bude.net, wurden von Raffael geschrieben. – Seit 2011 blogge ich hier über Programmierung, meine Software, schreibe Tutorials und versuche mein Wissen, so gut es geht, mit meinen Lesern zu teilen. Zudem schreibe ich auf derwirtschaftsinformatiker.de über Themen meines Studiums.  //    •  • Facebook  • Twitter


1 Kommentare

  1. Hallo,

    besten Dank für diesen Eintrag. Wir hatten auch das leidige Authentifizierungsproblem, und konnten es mit diesen Snippets super lösen. Wir haben noch ein Problem dass wir als Response immer null zurückbekommen, aber ich denke, das liegt eventuell daran, dass wir die Client-Proxys falsch erzeugt haben. als WCF oder so

    lg Michael

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.