16.4 Einen Web Service mit einem SOAP-Header sichern
 
Wenn Ihr Web Service nicht öffentlich zugänglich sein soll, sondern nur von registrierten Kunden genutzt werden darf, müssen Sie den Web Service gegen unbefugte Nutzung absichern. Eine Möglichkeit zur Realisierung besteht darin, vom anfragenden Web-Service-Konsumenten den Namen und das Passwort zu verlangen. Beides können Sie in einem SOAP-Header übertragen.
16.4.1 Einen passwortgeschützten Web Service erstellen
 
Das webservice01.asmx-Beispiel soll um einen solchen Authentifizierungsmechanismus erweitert werden. webservice02.asmx enthält den Code für den passwortgeschützten Web Service. Erläuterungen schließen sich an.
<!-- webservice02.asmx -->
<%@ WebService Language="VB" Class="webservice02" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Public Class Zugangserlaubnis : Inherits SoapHeader
Public username As String
Public passwort As String
End Class
<WebService( _
Description := "Sagt passwortgeschützt Hallo.", _
Namespace := "http://mlohrer.de/services")> _
Public Class webservice02 : Inherits WebService
Public myZugang As Zugangserlaubnis
<WebMethod _
(Description := "Sagt passwortgeschützt Hallo.", _
EnableSession := False), _
SoapHeader("myZugang")> _
Public Function SagHallo() As String
If myZugang Is Nothing Then
throw new Exception _
("Authentifizierung erforderlich. ")
Else
Dim validUser As String = "ML"
Dim validPass As String = "hugo2799"
If myZugang.username = validUser AND _
myZugang.passwort = validPass Then
Return ("Hallo")
Else
throw new Exception ("Login ungültig.")
End If
End If
End Function
End Class
webservice02.asmx enthält zwei Klassendefinitionen.
Die erste Klasse heißt Zugangserlaubnis und erbt von der Klasse SoapHeader. Die Klasse SoapHeader ist der Laufzeitumgebung bekannt, weil Sie zunächst den Namensraum System.Web.Services.Protocols importiert haben. Die Klasse Zugangserlaubnis ist sehr einfach aufgebaut. Sie enthält lediglich eine Eigenschaft username und eine Eigenschaft passwort.
Die zweite Klasse heißt webservice02, erbt von der WebService-Klasse und enthält den eigentlichen Web Service. Daher ist sie auch mit dem WebService-Attribut ausgezeichnet. Die Methode SagHallo() soll als Web Service zugänglich gemacht werden und wird deshalb mit dem WebMethod-Attribut ausgezeichnet. Innerhalb der Definition des WebMethod-Attributs legen Sie unter anderem fest, dass diese Methode einen SOAP-Header benötigt, der ein Zugangserlaubnis-Objekt transportieren soll. Gültige Werte für den Anwender und das Passwort werden im Code hart codiert.
Wenn Sie webservice02.asmx testweise im Browser aufrufen und den Vorgang SagHallo anklicken, dann werden die Beispielanfrage und -antwort nur im SOAP-Format angezeigt (siehe Abbildung 16.6). SOAP-Header können nur mit SOAP übertragen werden. HTTP-GET und POST scheiden hier aus und deswegen ist auch kein Testformular für die GET-Methode verfügbar.
16.4.2 Die Proxyklasse erzeugen
 
Nun schalten Sie in Gedanken wieder um auf den Rechner, der diesen Service nutzen möchte. Hier stellt sich die Aufgabe, die entsprechende Proxyklasse zu erzeugen und beim Aufruf des Web Services den Namen und das Passwort zu übermitteln.
Der folgende Aufruf erstellt den VB-Quellcode für die Proxyklasse. Dabei wird der Namensraum SafeWebServices verwendet.
wsdl /l:vb /n:SafeWebServices
http://localhost/ASPdotNETBuch/Listings/webservice02.asmx?WSDL
Den erstellten Quellcode kompilieren Sie mit diesem Befehl in die Datei SafeWebServices.dll:
vbc /t:library /out:../bin/SafeWebServices.dll /r:System.dll
/r:System.Xml.dll /r:System.Web.Services.dll webservice02.vb
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.6 Die Übertragung von Name und Passwort erfordert die Verwendung von SOAP. HTTP-POST und GET scheiden aus.
16.4.3 Den passwortgeschützten Web Service aufrufen
 
Beim Aufruf der passwortgeschützten Web Services müssen Sie Namen und Passwort an den Web Service übermitteln. webservice02.aspx zeigt das Verfahren:
<!-- webservice02.aspx -->
<%@ Page language="VB" strict="true" debug="true" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim pass As New SafeWebServices.Zugangserlaubnis
Dim serv As New SafeWebServices.webservice02
pass.username = "ML"
pass.passwort = "hugo2799"
serv.ZugangserlaubnisValue = pass
ausgabe.Text = serv.sagHallo()
End Sub
</script>
<html><head>
<title>Hallo-Webservice</title>
</head><body>
<asp:Label
id="ausgabe"
runat="server" />
</body></html>
In der Prozedur Page_Load erzeugen Sie zunächst ein Objekt von der Klasse SafeWebServices.Zugangserlaubnis:
Dim pass As New SafeWebServices.Zugangserlaubnis
Anschließend erstellen Sie ein Objekt für den Web Service selbst:
Dim serv As New SafeWebServices.webservice02
Dem pass-Objekt weisen Sie anschließend Namen und Passwort zu:
pass.username = "ML"
pass.passwort = "hugo2799"
Und in der nächsten Zeile passiert etwas Interessantes:
serv.ZugangserlaubnisValue = pass
Woher kommt die Eigenschaft ZugangserlaubnisValue? Die Erklärung folgt gleich. Werfen Sie erst noch einen Blick auf die letzte Zeile:
ausgabe.Text = serv.sagHallo()
Hier gibt es nichts Neues. Die sagHallo()-Methode wird aufgerufen und der Rückgabewert wird dem Label-Feld ausgabe als Text-Eigenschaft zugewiesen.
Nun zurück zu dieser Zeile:
serv.ZugangserlaubnisValue = pass
Das Tool wsdl.exe hat diese Eigenschaft generiert, als es die Selbstbeschreibung des Web Services ausgewertet und den VB-Quellcode erstellt hat. Wenn Sie die Quelldatei der Proxyklasse webservice02.vb öffnen, können Sie die Funktionsweise direkt am Code nachvollziehen. Hier finden Sie unter anderem diese Zeilen
Public Class webservice02 Inherits
System.Web.Services.Protocols.SoapHttpClientProtocol
Public ZugangserlaubnisValue As Zugangserlaubnis
' ...
End Class
16.4.4 Fazit: Web Services und Sicherheit
 
Der vorgestellte Passwortschutz mit Hilfe eines SOAP-Headers hat nur einen beschränkten praktischen Nutzen, da die Daten selbst, und dazu gehören auch der Anwendername und das Passwort, im Klartext übertragen werden. Um das zu vermeiden, muss HTTPS eingesetzt werden.
Spezifikationen für einen sicheren und transaktionsfähigen Einsatz von Web Services befinden sich derzeit noch in der Entwicklung. Einen Schritt in diese Richtung geht beispielsweise ein Projekt der Unternehmen BEA, IBM und Microsoft. Die Unternehmen haben gemeinsam die Business Process Execution Language for Web Services (BPEL4WS oder BPEL) entwickelt. Mit BPEL sollen sich Web Services einfach und zuverlässig zu verteilten Anwendungen kombinieren lassen. BPEL ist eine XML-Sprache zur Definition von Geschäftsprozessen. Auf der Basis von BPEL sollen sich künftig auch Transaktionen über Web Services ausführen lassen. Solange entsprechende Spezifikationen jedoch noch nicht vollständig vorliegen und auch in der Praxis erst ungenügend erprobt sind, eignen sich Web Services nur in begrenztem Maße für den unternehmenskritischen Einsatz.
|