Basic Authentifizierung bei einem SOAP / Webservice Aufruf

Sie haben einen Webservice (via wsdl zur Verfügung gestellt), welchen Sie aufrufen müssen? Der Betreiber des Webservice hat Basic Authentifizierung / Basic Authentification als Zugriffsmethode eingestellt. Den Webservice haben Sie via “Webverweis hinzufügen” unter Visual Studio mit dem Namen “WebServiceName” hinzugefügt. Die generierte Klasse MyServiceClass ist eine abgeleitete Klasse von SoapHttpClientProtocol aus dem namespace System.Web.Services.Protocols. Auf diese Klassen haben Sie bei entsprechenden via wsdl bereitgestellten Definitionen keinen Zugriff.

Leider reicht es nicht aus, wenn Sie die Zugangsdaten auf folgende Art und Weise hinzufügen:

ICredentials creds;
creds = new NetworkCredential(username, password);
WebServiceName.MyServiceClass client = new WebServiceName.MyServiceClass();
client.Credentials = creds;
client.PreAuthenticate = true;

client.MyMethodCall();

Die Lösung:

Sie müssen zusätzlich eine neue Klassendatei dem Projekt hinzufügen, welche demselben namespace wie MyServiceClass beinhaltet, z.B. WebServiceNameExtended.cs. Als nächstes erstellen Sie eine abgeleitete Klasse von MyServiceClass, z.B. MyServiceClassExtended. In diese Klasse fügen Sie eine Methode GetWebRequest() ein, welche die Standardklasse aus System.Net überschreibt. Auf diese Weise wird jeder Request, welcher abgesendet wird abgeändert und im Header die angegebenen Credentials mitgegeben und zusätzlich die Basic Authentifizierung eingeführt.

Beispiel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.Web.Services.Protocols;

namespace WebServiceName
{
    public class MyServiceClassExtended : MyServiceClass
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = (WebRequest)base.GetWebRequest(address);

            if (request.PreAuthenticate)
            {
                NetworkCredential networkCredentials = request.Credentials.GetCredential(address, "Basic ");
                if (networkCredentials != null)
                {
                    byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
                    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
                }
                else
                {
                    throw new ApplicationException("No network credentials");
                }
            }

            return request;
        }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.