Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

HTTP Basic Authentifizierung für Silverlight und Adobe AIR / Flex

In den letz­ten Wochen hatte ich die Möglichkeit, mich inten­siv mit der Entwicklung von Desktop Applikationen im Microsoft Silverlight sowie im Adobe AIR / Flex  Umfeld zu beschäf­ti­gen. Um Daten mit einem zur Verfügung gestell­ten REST Service aus­zu­tau­schen, muss sich zuvor per HTTP Basic Authentifizierung an die­sem ange­mel­det werden.

Sowohl mit Silverlight als auch mit AIR /Flex stieß ich hier auf Probleme. Das .NET Framework bie­tet hier­für das NetworkCredential Objekt, wel­ches dem WebClient per "Client.Credentials = NetworkCredentials" zuge­wie­sen wer­den kann.

NetworkCredential cred = new NetworkCredential(username,password);
Service.Credentials = cred;

Nach meh­re­ren erfolg­lo­sen Versuchen stand fest, Silverlight unter­stützt Credentials für HTTP WebClient Anfragen nicht.

Die Lösung ist denk­bar ein­fach: Die Credentials des Nutzers müs­sen ein­fach in den Request Header geschrie­ben wer­den. Hierbei muss beach­tet wer­den, dass die Daten BASE64 codiert in den Header geschrie­ben wer­den müs­sen. Dabei muss der Nutzer und das Passwort getrennt von Doppelpunkt codiert wer­den (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 erwar­ten ver­hält sich Adobe AIR und Flex hier nicht anders als Silverlight … Zum Glück. Auch hier müs­sen die Credentials, Base64 codiert, in die Reqeuest Header geschrie­ben wer­den. Sollte der URLLoader ver­wen­det wer­den, bie­tet Flex mehr Möglichkeiten den Status der Abfrage zu über­wa­chen. Wird volle Kontrolle über den Status ver­langt, sollte dar­auf geach­tet wer­den, dass zu aller Erst der HTTPStatusEvent und danach der Complete Event gefeu­ert wird.

An fol­gende Ereignisse kann ein Listener ange­hängt werden:

  • com­plete
  • httpStatus
  • ioError
  • open
  • pro­gess
  • 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 aus­rei­chend die Nutzer Daten in die Header zu schrei­ben. Wird dies ver­sucht erhält der Nutzer eine Anmeldemaske wie in der Abbindung unten.

Dieses ner­vige Fenster kann unter­drückt wer­den, indem die die Eigenschaft "authen­ti­cate" des URLRequests auf false gesetzt wird.

req.authenticate=false;
30. Mai 2011

Pin It on Pinterest