Authentifizierung in Web Services - SOAP Header
Geschrieben von: Christoph Wille 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 ServiceBeginnen 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 ClientDas 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ßbemerkungDer 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 CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Authentifizierung in Web Services - Windows Integrated 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.
©2000-2006 AspHeute.com |