In den letzten Wochen hatte ich die Möglichkeit, mich intensiv mit der Entwicklung von Desktop Applikationen im Microsoft Silverlight sowie im Adobe AIR / Flex Umfeld zu beschäftigen. Um Daten mit einem zur Verfügung gestellten REST Service auszutauschen, muss sich zuvor per HTTP Basic Authentifizierung an diesem angemeldet werden.
Sowohl mit Silverlight als auch mit AIR /Flex stieß ich hier auf Probleme. Das .NET Framework bietet hierfür das NetworkCredential Objekt, welches dem WebClient per "Client.Credentials = NetworkCredentials" zugewiesen werden kann.
NetworkCredential cred = new NetworkCredential(username,password); Service.Credentials = cred;
Nach mehreren erfolglosen Versuchen stand fest, Silverlight unterstützt Credentials für HTTP WebClient Anfragen nicht.
Die Lösung ist denkbar einfach: Die Credentials des Nutzers müssen einfach in den Request Header geschrieben werden. Hierbei muss beachtet werden, dass die Daten BASE64 codiert in den Header geschrieben werden müssen. Dabei muss der Nutzer und das Passwort getrennt von Doppelpunkt codiert werden (Nutzer : Passwort).
HTTP Basic Authentifizierung für Silverlight
Uri serviceUri = new Uri("http://yourAuthAddress.com"); WebClient downloader = new WebClient(); var encodedText = Convert.ToBase64String(Encoding.UTF8.GetBytes("John"+ ":" +"yourSecretPassword")); downloader.Headers["Authorization"] = "Basic " + encodedText; downloader.OpenReadCompleted += downloader_OpenReadCompleted; downloader.OpenReadAsync(serviceUri);
Wie zu erwarten verhält sich Adobe AIR und Flex hier nicht anders als Silverlight … Zum Glück. Auch hier müssen die Credentials, Base64 codiert, in die Reqeuest Header geschrieben werden. Sollte der URLLoader verwendet werden, bietet Flex mehr Möglichkeiten den Status der Abfrage zu überwachen. Wird volle Kontrolle über den Status verlangt, sollte darauf geachtet werden, dass zu aller Erst der HTTPStatusEvent und danach der Complete Event gefeuert wird.
An folgende Ereignisse kann ein Listener angehängt werden:
- complete
- httpStatus
- ioError
- open
- progess
- securityError
- httpResponseStatus
HTTP Basic Authentifizierung für Adobe AIR und FLEX 3/4
loader = new URLLoader(); var req:URLRequest = new URLRequest(serverUrl); req.method="get"; var headerRequests:Array = new Array(1); var encoder64:Base64Encoder = new Base64Encoder(); encoder64.encode("John" + ":" + "yourSecretPassword"); var base64Credentials:String = encoder64.toString(); req.requestHeaders.push(new URLRequestHeader("Authorization", "Basic " + base64Credentials)); req.authenticate=false; loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,handleHttpStatus); loader.addEventListener(IOErrorEvent.IO_ERROR,onError); loader.load(req);
Windows Anmeldefenster unterdrücken
Bei der Verwendung von AIR / Flex ist es nicht ausreichend die Nutzer Daten in die Header zu schreiben. Wird dies versucht erhält der Nutzer eine Anmeldemaske wie in der Abbindung unten.
Dieses nervige Fenster kann unterdrückt werden, indem die die Eigenschaft "authenticate" des URLRequests auf false gesetzt wird.
req.authenticate=false;