Inloggen met WP7

Laatst heb ik een blog gepost over het (heel simpel) beveiligen van een webservice. Ik kreeg wat vragen over hoe je met je Windows Phone 7 app hierop kan inloggen. Ik dacht, ik vul die vorige post even aan met een nieuwe :).

Om in te kunnen loggen met je Windows Phone 7 app, hebben we de websevice nodig uit die vorige blog Beveiligen van de OData webservice. Daarnaast, en vooral niet onbelangrijk, een Windows Phone 7 app. In deze laatste maken we een scherm aan met wat inloggegevens. In de webservice hebben we een methode gemaakt die username en password vraagt. Overigens, even voor diegenen die niet graag een plaintext password willen oversturen over een beveiligde lijn; het password kan je hashen voordat je het opstuurt. Ook als je je webservice host op AppHarbor, dan kan je HTTPS gebruiken om het enigsinds veiliger te maken.

Het scherm kan bijvoorbeeld twee TextBoxen krijgen voor de username en password. Natuurlijk kan je dit eventueel opslaan in de IsolatedStorageSettings, zodat de gebruiker dit niet altijd opnieuw hoeft in te voeren. Ik ga er even vanuit dat je een scherm kan maken en die TextBoxen erop kan zetten. Als je dan toch bezig bent, dan ook maar gelijk een button waarin we de service daadwerkelijk gaan aanroepen.

Web Reference

Voordat we daar aan die code beginnen, moet we een Web Reference maken naar de webservice.

Hier gebruiken we de URL van de webservice eindigend op SVC (voor een ODATA service) of in ons geval nu ASMX. Mocht hij hem niet pakken, dan kan je ook de opdracht geven direct de WSDL op te halen door [URL]/naamService.asmx?wsdl te gebruiken.

Nu zal Visual Studio 2010 een eigen tool gebruiken van de WSDL (de beschrijving van wat de webservice verwacht en wat wij kunnen verwachten) classes te maken. Deze classes komen overeen met bijvoorbeeld de methodes en andere classes die de webservice uitgeeft.

Nu dan de code

Achter de eventhandler van de button.click() (of liever natuurlijk in een ViewModel) kunnen we de code plaatsen om de service aan te roepen en dan vooral de Authenticate methode.

Webservice.OperationsSoapClient client = new Webservice.OperationsSoapClient();
client.AuthenticateCompleted += new EventHandler<Webservice.AuthenticateCompletedEventArgs>((s, a) =>
{
    if (a.Error == null)
    {
        this._Model.IsAuthenticated = a.Result;
    }
});
client.AuthenticateAsync(username, password);

Hierin zijn een aantal dingen belangrijk.

De Webservice is de naam van de Web Reference die ik heb toegevoegd. Deze kan je natuurlijk zelf anders noemen bij het maken van de web reference in je app.

De ASMX file heb ik Operations.asmx genoemd. Dit kan naturlijk van alles zijn. Bij het importeren van de web reference maakt Visual Studio 2010 de classes aan. Een daarvan is gebaseerd op de naam van deze ASMX pagina. De Soap client die we willen gebruiken heet dan in dit geval OperationsSoapClient. Deze instantieren we als client object.

We moeten, in de Windows Phone 7 apps, alles asynchroon laden, vandaar dat we met events werken, zodat we niet actief hoeven te wachten. Ik haal ergens die username en password vandaar en geef die mee – in de laatste regel – met een asynchrone call naar de webservice AuthenticateAsync(). Als de client klaar is met laden wordt het AuthenticateCompleted event getriggerd. Deze vang ik dan ook, boven de call, af op de anonyme manier bij AuthenticatedCompleted += new … Ik krijg hier via een Lambda expressie de parameters terug en een daarvan zijn de argumenten die ik terug krijg van de service. Deze heeft een result property die, in ons geval, een boolean terug geeft. Zie ook de Beveiligen van de OData webservice post.

Nu kunnen we dus weten of de gebruiker geauthorizeerd is of niet. Een true is van wel en natuurlijk de false van niet. Ook wordt een cookie gebruikt om de hele sessie te onthouden. Nu kunnen we de beveildigde gedeeltes van de OData webservice of gewone ASMX webservice benaderen.

Het kan zijn dat je een error krijgt hij het aanroepen van de webservice. Dit kan komen omdat hij het toevoegen een portnummer is toegevoegd. Deze kan je handmatig weer verwijderen uit je ServiceReferences.ClientConfig file in je Solution.

Hier kan je in de tag <endpoint address=”” de waarde veranderen waar achter de apphb.com (bijvoorbeeld) :[nummer] staat. Dit nummer (en de dubbele punt) kan je weg halen. Dan zou hij het wel moeten doen…

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

Zoals de meeste websites gebruiken we cookies om een meer persoonlijke en snelle service te bieden.

Wij gebruiken cookies zodat onze website meer efficiënt kan functioneren, om de prestaties te verbeteren en, eventueel, om op maat reclame van onze partners aan te bieden. Als u doorgaat gaan we ervan uit dat u akkoord gaat alle cookies te krijgen van onze website.

To accept cookies please Click To Continue