Adding Authentication Bruke Azure Mobile Services
15
Del
Del
Del
Dette Cyber mandag Envato Tuts + Kursene vil bli redusert til bare $ 3. Ikke gå glipp av.
Azure Mobile Services la deg autentisere brukere fra universelle Windows apps. I denne opplæringen vil du lære hvordan du:
legge godkjenning til en Windows Phone 8.1 WinRT app ved hjelp av ulike identitetsleverandører som støttes av Azure Mobile Services
butikk bufret autentiseringstokener på klienten
hente og lagre brukerprofil detaljer i en Azure database ved hjelp av server skript
legge til flere godkjennings scopes å hente mer brukerinformasjon fra serveren
redigere innsatsen manus av UsersTable å sette en rekord hvis en bruker med samme brukerid ikke eksisterer, og ellers oppdatere eksisterende bruker
Følgende trinn er nødvendig for å aktivere autentisering i programmet ditt:
< li> registrere din app for autentisering
konfigurere Azure Mobile Services
begrense bord tillatelser til godkjente brukere
konfigurere programmet til å bruke Azure Mobile Services
legg godkjenning til app
cache autentiseringstokener på klienten
hente brukerinformasjon fra serveren
Du må registrere app med en identitetsleverandør og legg til leverandør genererte legitimasjon til Azure Mobile Services. La oss først se hvordan du registrerer din app for Microsoft-konto pålogging.
1. App Registrering
For å bruke Live Koble som en godkjenningsleverandør for Azure Mobile Services, gjør du følgende
Trinn 1:. Opprett en ny app i Dev Senter
Åpne en nettleser og gå over til Dev Center for Windows Store apps. Naviger til Send en app siden og klikk App Navn
Trinn 2:. Reserve en App Name
Reserve en App navn og klikk på Lagre. Applikasjonen vil bli oppført i Windows-butikken under dette navnet
Trinn 3:.. Konfigurer Live-tjenester for App
På Services siden klikker Live Services under Windows Azure Mobile Services
Trinn 4: Merk appinnstillingene Verdier
Legg merke til verdiene av klient-ID, Client hemmelig, og Package sikkerhet (SID). Du trenger disse verdiene senere
Trinn 5:.. Sett Omadresser URI for App
Under API Innstillinger, leverer følgende verdi som Redirect URL og klikk på Lagre
https: //<mobile_service>.azure-mobile.net/login/microsoftaccount
This gjør at Microsoft-konto godkjenning for programmet ditt.
2. Konfigurere Azure Mobile Services
Når du har registrert din app med identiteten leverandør, må du konfigurere Azure Mobile Services bruker Azure Management Portal
Trinn 1:. Velg Mobile Service for App
Logg inn for å Azure Styringsportalen, klikk mobile tjenester, og velg din app
Trinn 2:. Konfigurer Push Settings
Under kategorien Push, angi Client Secret og Package SID verdier, og klikk på Lagre
Trinn 3:. Konfigurer Identity Settings
Under kategorien Identitet, sette Client ID. Også angi Client Secret og Package SID verdier hvis de ikke allerede er satt.
Du er nå klar til å bruke en Microsoft-konto for godkjenning i appen din med Azure Mobile Services.
3. Begrense Tabell Tillatelser
Bruke Azure Management Portal, kan vi dekke bordet tillatelser til å begrense tilgang kun til innloggede brukere
Trinn 1:. Velg UsersTable
Under Kategorien data i Azure Management Portal, velge tabellen som du vil endre tillatelsene. I denne opplæringen, skal vi endre tillatelser for UsersTable
Trinn 2:.. Dekket bord Tillatelser
Under kategorien Tillatelser, satt alle tillatelser til Kun godkjente brukere og klikker på Lagre
Når Windows Store-app forsøker å få tilgang til denne tabellen, et ubehandlet unntak med en statuskode på 401 (Uautorisert) er hevet. Dette skjer fordi programmet forsøker å få tilgang Azure Mobile Services som en godkjent bruker.
4. Konfigurere appen bruke Mobile Services
Deretter må vi konfigurere Windows Phone 8.1 WinRT app å bruke Azure Mobile Services
Trinn 1:. (Valgfritt) knytte App med butikken < .no>
Dette trinnet gjelder bare for Microsoft-konto pålogging leverandør. På registrering av Windows Store-app pakke informasjon med mobile tjenester, er klienten i stand til å gjenbruke Microsoft innloggingsdetaljer for en single sign-on erfaring.
Høyreklikk på prosjektet i Solution Explorer, velger du Lagre og klikk Associate App med den Store. I knytte App med veiviseren for Windows Store, klikker du Logg på og logger deg på med din Microsoft-konto. Velg app som du er registrert tidligere, og forbinder det med butikken
Den nødvendige Windows-butikken registrering informasjonen blir deretter lagt til applikasjonen manifest
Trinn 2:.. Legg Windows Azure Mobile Services SDK
Deretter legger Windows Azure Mobile Services SDK bruker nuget pakkebehandleren
Trinn 3:. Legg Azure Mobile Services som en tilkoblet Tjenesten
mobiltjeneste du opprettet i Azure Management Portal må være knyttet til programmet. Høyreklikk på prosjektet i Solution Explorer og velg tilkoblede tjenester under Legg.
I Service Manager dialogboksen som vises, velger du den mobile tjenesten som du opprettet tidligere, og klikk OK. Dette legger en forekomst av mobile tjenester i App.xaml.cs.
Trinn 4: Legg en klasse for UsersTable
Definer en klasse UsersTable hvis data Medlemmene representerer kolonnene i tabellen. . Du må legge til en referanse til Json.NET biblioteket i din app for å bruke JsonProperty klassen
klasse UsersTable {[JsonProperty (property = "id")] public String Id {får; sett; } [JsonProperty (property = "brukerid")] offentlig string UserID {får; sett; } [JsonProperty (property = "user_email")] offentlig string Email {får; sett; } [JsonProperty (property = "profile_picture")] offentlig string Blog {får; sett; } [JsonProperty (property = "DISPLAY_NAME")] offentlig string Display {får; sett; }}
5. Legg Authentication til App
Deretter vil vi legge til brukergodkjenning før vi be om noen ressurser fra den mobile tjenesten
Trinn 1:. Erklærer globale variabler
Erklærer et medlem variabel . global til hovedsiden klasse for lagring av godkjent bruker
privat MobileServiceUser bruker;
Trinn 2: Definer AuthenticateAsync Method
Vi legger til en metode som utfører godkjenningsprosessen. Den LoginAsync metoden tar identitetsleverandøren som parameter og håndterer autentisering flyt
privat async System.Threading.Tasks.Task AuthenticateAsync (). {User = avvente App.MobileService.LoginAsync (MobileServiceAuthenticationProvider.MicrosoftAccount);}
Trinn 3: håndtere responsen på App Activation
På Windows Phone 8.1, må du håndtere responsen fra WebAuthenticationBroker. Vi legger en OnActivated metode App.xaml.cs å håndtere dette svaret.
Beskyttet ride void OnActivated (IActivatedEventArgs args) {#if WINDOWS_PHONE_APP if (args.Kind == ActivationKind.WebAuthenticationBrokerContinuation) {App.MobileService.LoginComplete (args som WebAuthenticationBrokerContinuationEventArgs); } #endif Base.OnActivated (args);}
Hvis OnActivated metoden allerede eksisterer, bare legge den over #if ... # endif kode blokk. Merk at LoginAsync metoden må kalles etter OnNavigated metoden har blitt kalt, og etter at siden er lastet arrangementet har blitt utløst
Trinn 4:. Legg et Pålogging Button
Legg til en innloggingsknapp til appens MainPage.xaml og kalle en metode for å autentisere brukeren når knappen klikkes
. < Button Name = "ButtonLogin" Klikk = "ButtonLogin_Click" Synlighet = "Synlig" > Logg på < /Button >
På knapp klikk, ring AuthenticateAsync metode og skjule login knappen hvis autentiseringen er vellykket.
privat async void ButtonLogin_Click (objekt avsenderen, RoutedEventArgs e) {//Login brukeren og deretter laste data fra den mobile tjenesten. avvente AuthenticateAsync (); //Skjul innloggingsknappen og last elementer fra den mobile tjenesten. this.ButtonLogin.Visibility = Windows.UI.Xaml.Visibility.Collapsed;}
Trinn 5: Handle Unntak i AuthenticateAsync Method
Vår AuthenticateAsync metoden håndterer autentisering av brukere, men vi kan legge til kode for å håndtere unntak og alternative strømmer. Vi oppdaterer funksjonen iterativt ringe LoginAsync metoden før brukeren er ikke null. Ved vellykket autentisering, viser vi brukerid av godkjent bruker. Når brukeren er logget inn, skal appen kjøres uten feil
privat async System.Threading.Tasks.Task AuthenticateAsync () {while (bruker == null) {string melding.; try {bruker = avvente App.MobileService.LoginAsync (MobileServiceAuthenticationProvider.MicrosoftAccount); message = string.Format ("Du er nå logget inn - {0}", user.UserId); } Catch (InvalidOperationException) {message = "Pålogging påkrevd"; } Dialog var = ny MessageDialog (melding); dialog.Commands.Add (ny UICommand ("OK")); avvente dialog.ShowAsync (); }}
6. Cache autentiseringstokener på Client
AuthenticateAsync funksjonen krever kunden å kontakte både identitetsleverandør og mobil service hver gang programmet starter. Det er ikke veldig effektivt. Også, hvis mange brukere bruke programmet på samme tid, kan du kjøre inn last problemer.
For å bøte på dette problemet, kan vi cache autentiserings token. Vi kan prøve å bruke den bufrede autentisering token, faller tilbake til standard godkjenning flyt hvis autentisering token er ikke lenger gyldig
privat async System.Threading.Tasks.Task AuthenticateAsync (String leverandør) {string melding.; //Bruk PasswordVault å sikkert lagre og få tilgang legitimasjon. PasswordVault hvelv = new PasswordVault (); PasswordCredential legitimasjons = null; while (legitimasjons == null) {try {//Prøv å få en eksisterende credential fra hvelvet. credential = vault.FindAllByResource (leverandør) .FirstOrDefault (); } Catch (Exception) {//Når det ikke er samsvarende ressurs det oppstår en feil, som vi overser. } If (legitimasjons! = Null) {//Opprett en bruker fra de lagrede legitimasjon. user = ny MobileServiceUser (credential.UserName); credential.RetrievePassword (); user.MobileServiceAuthenticationToken = credential.Password; //Sett brukeren fra de lagrede legitimasjon. App.MobileService.CurrentUser = bruker; try {//Prøv å returnere en vare nå å finne ut om den bufrede legitimasjonen er utløpt. avvente App.MobileService.GetTable < TodoItem >. () Ta (1) .ToListAsync (); } Catch (MobileServiceInvalidOperationException ex) {if (ex.Response.StatusCode == System.Net.HttpStatusCode.Unauthorized) {//Fjern legitimasjons med den utløpte token. vault.Remove (legitimasjons); credential = null; fortsette; }}} Else {try {//Logg inn med identitetsleverandøren. bruker = avvente App.MobileService.LoginAsync (leverandør); //Lag og lagre brukerlegitimasjon. credential = new PasswordCredential (leverandør, user.UserId, user.MobileServiceAuthenticationToken); vault.Add (legitimasjons); } Catch (MobileServiceInvalidOperationException ex) {message = "Du må logge inn for pålogging kreves."; }} Message = string.Format ("Du er nå logget inn - {0}", user.UserId); dialog var = ny MessageDialog (melding); dialog.Commands.Add (ny UICommand ("OK")); avvente dialog.ShowAsync (); }}
Den modifiserte AuthenticateAsync funksjonen forsøker å bruke legitimasjonen lagret i PasswordVault å få tilgang til mobile tjenester. Følgende sekvens av hendelser inntreffer:
Hvis legitimasjon er til stede, de er hentet fra PasswordVault
En enkel spørring blir sendt for å bekrefte at token ikke er utløpt <.. br>
Hvis serveren svarer med en 401-statuskode, så vi faller tilbake til standard godkjenning flyt.
Hvis PasswordVault ikke inneholder noen legitimasjon, vi faller tilbake til standard godkjenning flyt.
Merk at app tester for utgåtte autentiserings under pålogging. Imidlertid kan autentiseringstokener utløper etter godkjenning, når brukeren bruker appen. En MSDN blogginnlegg forklarer hvordan du skal håndtere en slik situasjon.
7. Hente brukerinformasjon
Klient gjenstander må ikke utsettes all brukerinformasjon, men på serveren kan vi få all den informasjonen vi trenger. Bruker objekt, som er sendt til alle skript, har en getIdentities funksjon som returnerer et objekt med leverandørspesifikke data. Den kan brukes til å spørre brukeren informasjon. For en bruker autentiseres med en Microsoft-konto, blir objektet returnert av ringer user.getIdentities product: {"Microsoft". {"Brukerid": "MicrosoftAccount: my-faktiske-bruker-id", "accessToken": "den -actual-access-token "}}
For å få brukerinformasjon, sender vi en forespørsel til https://apis.live.net/v5.0/me/~~V, passerer tilgangstokenet som en parameter. Mengden av informasjon som er tilgjengelig fra leverandørene til de bruker skript er begrenset. Dette er resultatet av forespørselen til /meg endepunkt: product: {"id": "min-live-id", "name": "Vivek Maskara", "FIRST_NAME": "Vivek", "last_name": "Maskara", "link": "https://profile.live.com/", "kjønn": null, "locale": "no", "updated_time": "2015-03-10T16: 03: 43- 08:00 "}
Flere godkjennings scopes trenger å bli bedt for mer informasjon. Azure Mobile Services tillate oss å angi egendefinerte scopes som sendes til godkjennings leverandører når du utfører serversiden godkjenning.
Som standard innloggings bare ber om wl.basic omfang. Vi kan få mer informasjon om brukeren hvis vi setter noen ekstra scopes. La oss nå be om en ekstra omfang fra Microsoft innlogging.
Under fanen Konfigurer av den mobile tjenesten, sett MS_MicrosoftScope i app innstillinger.
Som en følge av denne endringen, vil jeg få tilleggsinformasjon jeg ba om etter å ha logget inn igjen product: {"id":. "my-live-id", "name": "Vivek Maskara", "FIRST_NAME": "Vivek", "last_name": "Maskara", "link": "https://profile.live.com/", "kjønn": null, "e-post": {"foretrukne": "[email protected]", "konto": "[email protected] "," personlig ": null," business ": null}," locale ":" no "," updated_time ":" 2015-03-10T16: 03: 43-08: 00 "}
Hvis brukeren logget inn via en Microsoft-konto, vil den sende en forespørsel til Live Connect APIer, passerer den lagrede token i brukeridentiteter objekt. Til slutt vil det analysere JSON objekt som returneres og hente brukerprofildetaljer
user.getIdentities ({suksess:. Funksjons (identiteter) {var url; Var oauth = null; if (identities.microsoft) {var liveAccessToken = identities.microsoft.accessToken; url = 'https://apis.live.net/v5.0/me/?method=GET&access_token=' + liveAccessToken;} if (url) {var requestCallback = function (err, resp , kroppen) {if (err || resp.statusCode == 200) {console.error ('Feil under sending av data til leverandøren:', err); request.respond (statusCodes.INTERNAL_SERVER_ERROR, kroppen);} else {prøve {var Userdata = JSON.parse (kroppen); item.userId = user.userId; item.display_name = userData.name; item.user_email = userData.emails ['konto']; request.execute ();} catch (ex ) {console.error ('Error parsing svar fra leverandøren API:', ex); request.respond (statusCodes.INTERNAL_SERVER_ERROR, ex);}}} Var req = krever ('forespørsel'); Var reqOptions = {uri: url, overskrifter: {Godta: "application /json"}}; req (reqOptions, requestCallback); } Else {//Sett med standard brukernavn request.execute (); }}});
Vi trenger nå å endre innsatsen skript for å sette en ny rekord hvis en bruker med brukerid ikke eksisterer. Hvis en bruker eksisterer, oppdaterer vi at brukeren. Du kan bruke en server-side bord script for å sjekke om en post eksisterer før fullført innsatsen drift.
Her er et eksempel script som sjekker om noen av postene i tabellen har en matchende brukerid verdi og, hvis det er tilfelle, betyr det ikke utføre et innstikk
funksjon innsats (element, bruker, forespørsel) {var bordet = tables.getTable ('UsersTable.'); . table.where ({brukerid: user.userId}) lest ({suksess: upsertItem}); fungere upsertItem (existingItems) {if (existingItems.length === 0) {request.execute (); } Else {item.id = existingItems [0] .id; table.update (element, {suksess: function (updatedItem) {request.respond (200, updatedItem)}}); }}}
Vi kan nå kombinere begge skript for å konstruere vår endelige innsats script for UsersTable. Under fanen Script of UsersTable, Innsetting script med følgende skript:
funksjon innsats (element, bruker, forespørsel) {item.display_name = "< ukjent >"; //Standard Var bordet = tables.getTable ('UsersTable'); . table.where ({brukerid: user.userId}) lest ({suksess: upsertItem}); fungere upsertItem (existingItems) {if (existingItems.length === 0) {user.getIdentities ({suksess: function (identiteter) {var url; Var oauth = null; if (identities.microsoft) {var liveAccessToken = identities.microsoft .accessToken; url = 'https://apis.live.net/v5.0/me/?method=GET&access_token=' + liveAccessToken;} if (url) {var requestCallback = function (err, resp, kroppen) {if (! err || resp.statusCode == 200) {console.error ('Feil under sending av data til leverandøren:', err); request.respond (statusCodes.INTERNAL_SERVER_ERROR, kroppen);} else {prøve {var Userdata = JSON.parse (kroppen); item.userId = user.userId; item.display_name = userData.name; item.user_email = userData.emails ['konto']; request.execute ();} catch (ex) {konsoll .error ('Error parsing respons fra leverandøren API:', ex); request.respond (statusCodes.INTERNAL_SERVER_ERROR, ex);}}} Var req = krever ('forespørsel'); Var reqOptions = {URI: url, overskrifter: {Godta: "application /json"}}; req (reqOptions, requestCallback); } Else {//Sett med standard brukernavn request.execute (); }}}); } Else {//vi har oppdatert brukeren med eksisterende verdier, men du kan sette nye verdier her. item.id = existingItems [0] .id; item.userId = existingItems [0] .userId; item.display_name = existingItems [0] .display_name; item.user_email = existingItems [0] .user_email; item.profile_picture = existingItems [0] .profile_picture; table.update (element, {suksess: function (updatedItem) {request.respond (200, updatedItem)}}); }}}
Nå som vi har oppdatert innsatsen skriptet, vil enhver oppfordring til et innstikk operasjon legge til en ny rekord hvis en bruker med en bestemt brukerid ikke eksisterer. Dessuten er innsatsen elementet oppdatert med brukerinformasjon brukerid, navn og e-post.
Jeg har lagt til en metode InsertUser, som tar en parameter bruker av typen UsersTable og setter den inn i tabellen.
Privat async Task InsertUser (UsersTable bruker) {avvente peopleTable.InsertAsync (bruker);}.
Etter samtalen til AuthenticateAsync metoden på knapp klikk, jeg kaller InsertUser metode for å legge brukeren til UsersTable
avvente InsertUser (ny UsersTable {Blog = string.Empty});
Du kan kjøre programmet i emulator for å se om det fungerer. Når du logger inn for andre gang, bruker app den bufrede autentisering token stedet for å presentere innloggingsbildet.
Konklusjon
autentisering av brukere for ulike identitetsleverandører bruker Azure Mobile Services er ganske enkel. I denne opplæringen, jeg viste hvordan en Microsoft-konto kan brukes til autentisering. Fremgangsmåten for å bruke andre identitetsleverandører er den samme. Bare leverandøren parameter må endres i AuthenticateAsync samtalen. Det anbefales å cache autentisering token, slik at brukeren kan oppleve single sign-on.
Andre autentiserings scopes kan bli bedt om å hente mer brukerinformasjon. Denne MSDN artikkelen drøfter hvordan det kan gjøres av ulike identitetsleverandører. Føl deg fri til å laste ned opplæringen sin kildefilene for referanse. Husk å konfigurere programmet til å bruke Azure Mobile Services før distribusjon den.