Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Einstieg in ASP.NET von Matthias Lohrer
Einstieg in ASP.NET
gp Kapitel 16 Web Services
  gp 16.1 Wie Web Services funktionieren
    gp 16.1.1 Basistechnologie HTTP
    gp 16.1.2 Basistechnologie XML
    gp 16.1.3 Basistechnologie SOAP
    gp 16.1.4 Umdenken beim Entwickeln von Web Services
  gp 16.2 Einen einfachen Web Service erstellen und anbieten
    gp 16.2.1 Die Datei webservice01.asmx erstellen
    gp 16.2.2 webservice01.asmx im Browser aufrufen
  gp 16.3 Einen Web Service verwenden
    gp 16.3.1 Eine Proxyklasse erstellen
  gp 16.4 Einen Web Service mit einem SOAP-Header sichern
    gp 16.4.1 Einen passwortgeschützten Web Service erstellen
    gp 16.4.2 Die Proxyklasse erzeugen
    gp 16.4.3 Den passwortgeschützten Web Service aufrufen
    gp 16.4.4 Fazit: Web Services und Sicherheit
  gp 16.5 Ein DataSet-Objekt übertragen
    gp 16.5.1 Den Web Service in einer asmx-Datei erstellen
    gp 16.5.2 Die Proxyklasse erzeugen
  gp 16.6 Web Services finden
    gp 16.6.1 Discovery
    gp 16.6.2 UDDI
  gp 16.7 Zusammenfassung und Ausblick
    gp 16.7.1 Zusammenfassung
    gp 16.7.2 Ausblick
    gp 16.7.3 Ressourcen


Galileo Computing

16.4 Einen Web Service mit einem SOAP-Header sichern  downtop

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.


Galileo Computing

16.4.1 Einen passwortgeschützten Web Service erstellen  downtop

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.


Galileo Computing

16.4.2 Die Proxyklasse erzeugen  downtop

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

Abbildung
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.


Galileo Computing

16.4.3 Den passwortgeschützten Web Service aufrufen  downtop

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

Galileo Computing

16.4.4 Fazit: Web Services und Sicherheit  toptop

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.

  

Einstieg in VB.NET

VB.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de