Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Authentifizierung in Web Services - SOAP Header

Geschrieben von: Christoph Wille
Kategorie: Web Services

Im letzten Artikel zum Thema Authentifizierung in Web Services haben wir uns mit protokollabhängiger Authentifizierung beschäftigt. Obwohl Windows Integrated eine gute Intranet-Lösung ist, so ist sie nicht Plattform-übergreifend, man ist an Windows Clients gebunden. Man kann diese Einschränkung umgehen, indem man zusätzliche SOAP Header in den SOAP Nachrichten mitschickt.

Der "Trick" mit den zusätzlichen SOAP Headern bringt uns Plattformunabhängigkeit, allerdings auch ein "Problem": wir müssen unsere Authentifizierungs-SOAP-Header und deren Verwendung für Konsumenten unseres Services dokumentieren. Denn ohne das Mitsenden der Authentifizierungsdaten kann niemand mit unserem Service kommunizieren - und diesen werden wir jetzt gleich implementieren.

Der Web Service

Beginnen wir damit, uns den Code für den Service Stück für Stück anzusehen:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

// Notwendig für die Definition neuer SOAP Header
using System.Web.Services.Protocols;

namespace SoapHeaderAuth
{
  public class Service1 : System.Web.Services.WebService
  {
    public Service1()
    {
    }

    // Unsere Klasse für den Authentifizerungs-SOAP-Header
    public class ServiceAuthHeader : SoapHeader 
    {
      public string Username;
      public string Password;
    }

Das hinzugefügte using Statement brauchen wir, damit wir eine von SoapHeader abgeleitete Klasse erstellen können. Diese Klasse - ServiceAuthHeader - ist der Authentifizierungs-SOAP-Header, der durch eine public Variable repräsentiert wird, welche via dem SoapHeaderAttribute auf der entsprechenden Methode befüllt wird.

    // Diese Instanzvariable wird später verwendet, um den SOAP Header auszulesen
    public ServiceAuthHeader CurrentUser;

    [WebMethod]
    [SoapHeader("CurrentUser")]
    public string SoapHeaderAuthSampleMethod()
    {
      Authenticate();

      return "Hello World, " + CurrentUser.Username;
    }

    private void Authenticate()
    {
      if (CurrentUser.Username != "test" || CurrentUser.Password != "test")
      {
        // Normalerweise würde man fehlgeschlagene Logins im Eventlog mitschreiben
        // Dem User wird so wenig sicherheitsrelevante Information zurückgeschickt als möglich
        throw new SoapException("Log in fehlgeschlagen", 
                                SoapException.ServerFaultCode);
      }
    }
  }
}

Da es sich um einen zusätzlichen SOAP Header und keine Authentifizierungsmethode der Infrastruktur handelt, müssen wir die Authentifizierung selbst vornehmen. Diese ist in die Authenticate Methode ausgelagert, damit sie in anderen Web Methods wiederverwendet werden kann. Im übrigen wird man im echten Leben gegen Benutzerdatenbanken und nicht hardcodierte Daten validieren.

Der Client

Das Generieren des Web Service Proxy verläuft identisch mit normalen, ungesicherten Web Services. Der Aufruf des Services ändert sich aber, da wir den zusätzlichen SOAP Header anlegen und übergeben müssen:

using System;

namespace SoapHeaderAuthClient
{
  class ConsoleAppWsClient
  {
    [STAThread]
    static void Main(string[] args)
    {
      // Instanz des Authentifierungs-SOAP-Headers anlegen und Werte eintragen
      localhost.ServiceAuthHeader sah = new localhost.ServiceAuthHeader();
      sah.Username = "test";
      sah.Password = "test";

      // Neue Service Instanz anlegen
      localhost.Service1 svc = new localhost.Service1();
      
      // Den SOAP Header anfügen; immer <Datentyp>Value
      svc.ServiceAuthHeaderValue = sah;

      string strResult = svc.SoapHeaderAuthSampleMethod();
      Console.WriteLine(strResult);
    }
  }
}

Das WSDL Utility (bzw das "Add Web Reference" Tool in VS.NET) autogeneriert eine Proxy-Klasse für den zusätzlichen SOAP Header. Einzig bei der Zuweisung muß man aufpassen - es wird nicht auf die public Variable des Services zugewiesen, sondern auf eine Eigenschaft namens <Datentyp>Value. Da es immer so ist, ist es auch leicht zu merken.

Damit hätten wir alles notwendige für die Authentifizierung via Custom SOAP Headers implementiert. Der Programmieraufwand hält sich in Grenzen, und schon haben wir einen Service, der Cross-Plattform Authentifizerung beherrscht.

Schlußbemerkung

Der Haken an der Sache ist, daß jeder seine eigenen SOAP Authentifizierungsheader erfinden würde, und man jedes Mal nachlesen muß, wie für den spezifischen Server diese Header auszusehen haben. Das haben sich einige Firmen wie IBM oder Microsoft auch gedacht, und einen Standard für Authentifizierung aus der Taufe gehoben: WS-Security. Dieser legt die Header für Authentifizierung fest, und die Herstellerfirmen liefern Toolkits, die man zur Programmierung von WS-Security verwenden kann. Mit dem Microsoft Toolkit beschäftigen wir uns in den nächsten beiden Artikeln.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Authentifizierung in Web Services - Windows Integrated
Authentifizierung in Web Services - WS-Security, Benutzername / Passwort

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.