Adăugarea autentificării utilizând serviciile mobile Azure

Serviciile Azure Mobile vă permit să autentificați utilizatorii din aplicațiile Windows universale. În acest tutorial, veți învăța cum să:

  • adăugați autentificarea la o aplicație Windows Phone 8.1 WinRT care utilizează diferiți furnizori de identitate susținuți de Azure Mobile Services
  • să stocați jetoanele de autentificare cache pentru client
  • prelua și stochează detaliile profilului utilizatorului într-o bază de date Azure folosind scripturi de server
  • adăugați domenii suplimentare de autentificare pentru a prelua mai multe informații de la utilizator de la server
  • editați scriptul de inserare al UsersTable pentru a insera o înregistrare în cazul în care un utilizator cu același numele de utilizator nu există și altfel actualizați utilizatorul existent

Următorii pași sunt necesari pentru a activa autentificarea în aplicația dvs.:

  • înregistrați-vă aplicația pentru autentificare
  • configurați serviciile mobile Azure
  • restricționa permisiunile de tabelă utilizatorilor autentificați
  • configurați aplicația să utilizeze serviciile mobile Azure
  • adăugați autentificare la aplicație
  • cache-uri de autentificare cache pe client
  • prelua informațiile despre utilizator de pe server

Trebuie să vă înregistrați aplicația împreună cu un furnizor de identitate și să adăugați acreditările generate de furnizor către Azure Mobile Services. Să vedem mai întâi cum să vă înregistrați aplicația pentru conectarea la contul Microsoft. 

1. Înregistrarea aplicațiilor

Pentru a utiliza Live Connect ca furnizor de autentificare pentru Azure Mobile Services, urmați acești pași.

Pasul 1: Creați o aplicație nouă în Centrul Dev

Deschideți un browser și accesați aplicațiile Dev Center pentru aplicațiile Windows Store. Navigați la Trimiteți o aplicație pagina și faceți clic pe Numele aplicatiei.

Pasul 2: Rezervați un nume de aplicație

Rezervați un Numele aplicatiei și faceți clic pe Salvați. Aplicația va fi afișată în Magazinul Windows sub acest nume.

Pasul 3: Configurați serviciile live pentru aplicație

Pe Servicii pagina, faceți clic pe Servicii live sub Windows Azure Mobile Services.

Pasul 4: Notați valorile setărilor aplicației

Notați valorile ID-ul clientului, Secretul clientului, și Identificatorul de securitate al pachetului (SID). Veți avea nevoie de aceste valori mai târziu.

Pasul 5: Setați URI de redirecționare pentru aplicație

Sub Setări API, furnizați următoarea valoare ca Redirecționați URl și faceți clic pe Salvați.

https: //.azure-mobile.net/login/microsoftaccount

Aceasta permite autentificarea contului Microsoft pentru aplicația dvs..

2. Configurați serviciile Azure Mobile Services

Odată ce v-ați înregistrat aplicația la furnizorul de identitate, trebuie să configurați Azure Mobile Services utilizând portalul Azure Management.

Pasul 1: Selectați serviciul mobil pentru aplicație 

Conectați-vă la Portalul de administrare Azure, faceți clic pe Servicii mobile, și selectați aplicația.

Pasul 2: Configurați setările Push

Sub Apăsați , introduceți fila Secretul clientului și Pachetul SID valori și faceți clic pe Salvați.

Pasul 3: Configurați setările de identitate

Sub Identitate filă, setați ID-ul clientului. De asemenea, setați Secretul clientului și Pachetul SID dacă nu sunt deja stabilite.

Acum sunteți gata să utilizați un cont Microsoft pentru autentificarea în aplicația dvs. folosind serviciile Azure Mobile Services.

3. Restricționați permisiunile de masă

Utilizând portalul Azure Management, putem seta permisiunile tabelului pentru a restricționa accesul numai la utilizatorii conectați.

Pasul 1: Selectați tabelul Users

Sub Date în Azure Management Portal, alegeți tabelul pentru care doriți să schimbați permisiunile. În acest tutorial, modificăm permisiunile pentru UsersTable.

Pasul 2: Setați permisiunile pentru tabele

Sub Permisiuni fila, setați toate permisiunile pentru Numai utilizatorii autentificați și faceți clic pe Salvați.

Atunci când aplicația Magazin Windows încearcă să acceseze acest tabel, se ridică o excepție nefolosită, cu un cod de stare de 401 (neautorizat). Acest lucru se întâmplă deoarece aplicația încearcă să acceseze serviciile Azure Mobile Services ca utilizator neautorizat.

4. Configurați aplicația pentru a utiliza serviciile mobile

Apoi, trebuie să configurați aplicația Windows Phone 8.1 WinRT pentru a utiliza Azure Mobile Services.

Pasul 1: (Opțional) Asociați aplicația dvs. cu magazinul

Acest pas se aplică numai furnizorului de date de conectare la contul Microsoft. La înregistrarea informațiilor din pachetul de aplicații Windows Store cu serviciile mobile, clientul poate reutiliza detaliile de conectare ale Microsoft pentru o singură experiență de conectare. 

Faceți clic dreapta pe proiect în Soluție Explorer, Selectați Magazin și faceți clic pe Asociați aplicația cu Magazinul. În Asociați-vă aplicația cu Magazinul Windows vrăjitor, faceți clic pe conectare și conectați-vă cu contul dvs. Microsoft. Selectați aplicația pe care ați înregistrat-o mai devreme și Asociat cu magazinul.

Informațiile necesare pentru înregistrarea din Windows Store sunt apoi adăugate la manifestul de aplicații.

Pasul 2: Adăugați un kit SDK pentru Windows Azure Mobile Services

Apoi, adăugați Windows Azure Mobile Services SDK utilizând managerul de pachete NuGet.

Pasul 3: Adăugați serviciile mobile Azure ca serviciu conectat

Serviciul mobil pe care l-ați creat în Portalul de administrare Azure trebuie să fie legat de aplicație. Faceți clic dreapta pe proiect în Soluție Explorer și selectați Servicii conexe sub Adăuga.

În Manager de servicii caseta de dialog care apare, alegeți serviciul mobil pe care l-ați creat mai devreme și faceți clic pe O.K. Aceasta adaugă o instanță a serviciului mobil în App.xaml.cs.

Pasul 4: Adăugați o clasă pentru utilizatori

Definiți o clasă UsersTable ale căror elemente de date reprezintă coloanele din tabel. Va trebui să adăugați o referință la biblioteca Json.NET din aplicația dvs. pentru a utiliza JsonProperty clasă.

clasa UsersTable [JsonProperty (PropertyName = "id")] șirul public Id get; a stabilit;  [JsonProperty (PropertyName = "userId")] șir public UserID get; a stabilit;  [JsonProperty (PropertyName = "user_email")] șir public Email get; a stabilit;  [JsonProperty (PropertyName = "profile_picture")] șir public ProfilePicture get; a stabilit;  [JsonProperty (PropertyName = "display_name")] șir public DisplayName get; a stabilit; 

5. Adăugați autentificare în aplicație

Apoi, vom adăuga autentificarea utilizatorului înainte de a solicita orice resurse de la serviciul mobil.

Pasul 1: Declarați variabilele globale

Declarați o variabilă membră globală la Pagina principală pentru stocarea utilizatorului autentificat.

utilizator privat MobileServiceUser;

Pasul 2: Definiți AuthenticateAsync Metodă

Adăugăm o metodă care efectuează procesul de autentificare. LoginAsync metoda ia furnizorul de identitate ca parametru și gestionează fluxul de autentificare.

async privat System.Threading.Tasks.Task AuthenticateAsync () user = await App.MobileService.LoginAsync (MobileServiceAuthenticationProvider.MicrosoftAccount); 

Pasul 3: Gestionați răspunsul la activarea aplicațiilor

În Windows Phone 8.1, trebuie să rezolvați răspunsul de la WebAuthenticationBroker. Adăugăm un OnActivated metoda în App.xaml.cs să se ocupe de acest răspuns.

protejate override void OnActivated (IActivatedEventArgs args) #if WINDOWS_PHONE_APP dacă (args.Kind == ActivationKind.WebAuthenticationBrokerContinuation) App.MobileService.LoginComplete (args ca WebAuthenticationBrokerContinuationEventArgs);  #endif base.OnActivated (args); 

În cazul în care OnActivated metoda există deja, doar adăugați cele de mai sus # dacă ... #endif cod bloc. Rețineți că LoginAsync metoda trebuie să fie numită după OnNavigated metoda a fost apelată și după pagina Încărcat evenimentul a fost declanșat.

Pasul 4: Adăugați un buton de conectare

Adăugați un buton de conectare la aplicațiile dvs. MainPage.xaml și apelați o metodă de autentificare a utilizatorului când faceți clic pe buton.

Pe butonul clic, apelați AuthenticateAsync și ascundeți butonul de autentificare dacă autentificarea are succes.

privat async void ButtonLogin_Click (expeditor obiect, RoutedEventArgs e) // Conectați utilizatorul și apoi încărcați datele din serviciul mobil. asteapta AuthenticateAsync (); // Ascundeți butonul de conectare și încărcați articole din serviciul mobil. this.ButtonLogin.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 

Pasul 5: Efectuați excepții în AuthenticateAsync Metodă

Al nostru AuthenticateAsync Metoda se ocupă de autentificarea utilizatorilor, dar putem adăuga coduri pentru a gestiona excepțiile și fluxurile alternative. Actualizăm funcția pentru a apela iterativ LoginAsync până la utilizator nu este nul. La autentificarea cu succes, afisem Numele de utilizator a utilizatorului autentificat. Odată ce utilizatorul este conectat cu succes, aplicația trebuie să ruleze fără erori.

async privat System.Threading.Tasks.Task AuthenticateAsync () în timp ce (user == null) mesaj string; încercați user = aștepta App.MobileService.LoginAsync (MobileServiceAuthenticationProvider.MicrosoftAccount); message = string.Format ("Sunteți conectat acum - 0", user.UserId);  captură (InvalidOperationException) message = "Conectare necesară";  var dialog = nou MessageDialog (mesaj); dialog.Commands.Add (noul UICommand ("OK")); așteptați dialog.ShowAsync (); 

6. Jetoane de autentificare cache pe client

AuthenticateAsync necesită ca clientul să contacteze atât furnizorul de identitate, cât și serviciul mobil de fiecare dată când începe aplicația. Acest lucru nu este foarte eficient. De asemenea, dacă mulți utilizatori utilizează aplicația în același timp, este posibil să întâmpinați probleme de încărcare.

Pentru a remedia această problemă, putem memora cache-ul de autentificare. Putem încerca să folosim jetonul de autentificare în memoria cache, revenind la fluxul de autentificare implicit dacă tokenul de autentificare nu mai este valabil.

async privat System.Threading.Tasks.Task AuthenticateAsync (furnizor de șir) string message; // Utilizați PasswordVault pentru a stoca în siguranță și pentru a accesa acreditările. PasswordVault vault = noul PasswordVault (); PasswordCredential credential = null; în timp ce (credential == null) try // Încercați să obțineți o acreditare existentă din seif. credential = vault.FindAllByResource (furnizor) .FirstOrDefault ();  catch (Excepție) // Când nu există nici o resursă potrivită apare o eroare, pe care o ignorăm.  if (credential! = null) // Creați un utilizator din acreditările stocate. user = nou MobileServiceUser (credential.UserName); credential.RetrievePassword (); user.MobileServiceAuthenticationToken = credential.Password; // Stabiliți utilizatorul de la acreditările stocate. App.MobileService.CurrentUser = utilizator; încercați // Încercați să returnați un element acum pentru a determina dacă acreditarea memorată în cache a expirat. așteaptă App.MobileService.GetTable() .Take (1) .ToListAsync ();  captură (MobileServiceInvalidOperationException ex) if (ex.Response.StatusCode == System.Net.HttpStatusCode.Unautorizat) // Eliminați acreditarea cu tokenul expirat. vault.Remove (acreditare); credential = null; continua;  altceva try // Conectați-vă la furnizorul de identitate. user = așteaptă App.MobileService.LoginAsync (furnizor); // Creați și salvați acreditările utilizatorului. credential = noua ParolaCredential (furnizor, user.UserId, user.MobileServiceAuthenticationToken); vault.Add (acreditare);  captură (MobileServiceInvalidOperationException ex) message = "Trebuie să vă conectați. Conectare necesară";  message = string.Format ("Sunteți logat acum - 0", user.UserId); var dialog = nou MesajDialog (mesaj); dialog.Commands.Add (noul UICommand ("OK")); așteptați dialog.ShowAsync (); 

Modificat AuthenticateAsync funcția încearcă să utilizeze acreditările stocate în PasswordVault pentru a accesa serviciul mobil. Apare următoarea secvență de evenimente:

  • Dacă sunt prezente acreditările, acestea sunt preluate de la PasswordVault.
  • Se trimite o interogare simplă pentru a verifica dacă tokenul nu a expirat.
  • Dacă serverul răspunde cu un cod de stare 401, revenim la fluxul de autentificare implicit.
  • În cazul în care PasswordVault nu conține un acreditări, revenim la fluxul de autentificare implicit.

Rețineți că aplicația testează jetoanele de autentificare expirate în timpul conectării. Cu toate acestea, jetoanele de autentificare pot expira după autentificare, atunci când utilizatorul utilizează aplicația. O postare de pe forumul MSDN explică modul de gestionare a unei astfel de situații.

7. Obțineți informațiile despre utilizator

Obiectele clientului nu expun toate informațiile despre utilizator, dar pe server putem obține toate informațiile de care avem nevoie. Utilizator obiect, care este trecut la toate scripturile, are un getIdentities care returnează un obiect cu date specifice furnizorului. Acesta poate fi folosit pentru interogarea informațiilor despre utilizator. Pentru un utilizator autentificat cu un cont Microsoft, obiectul este returnat prin apelare user.getIdentities.

"microsoft": "userId": "MicrosoftAccount: my-actual-user-id", "accessToken": "token-access-actual" 

Pentru a obține informațiile despre utilizator, trimitem o solicitare https://apis.live.net/v5.0/me/, transmiterea indicativului de acces ca parametru. Cantitatea de informații disponibile de la furnizori la scripturile utilizatorilor este limitată. Acesta este rezultatul solicitării către /pe mine punct final:

"id": "my-live-id", "nume": "Vivek Maskara", "first_name": "Vivek", "last_name": "https://profile.live .com / "," gen ": null," locale ":" en_US "," updated_time ":" 2015-03-10T16: 03: 43-08: 00 "

 Domeniile suplimentare de autentificare trebuie să fie solicitate pentru mai multe informații. Serviciile Azure Mobile ne permit să specificăm domenii personalizate care sunt transmise furnizorilor de autentificare atunci când efectuează autentificarea de pe server.

În mod implicit, datele de conectare solicită numai wl.basic domeniul de aplicare. Putem obține mai multe informații despre utilizator dacă vom stabili anumite domenii suplimentare. Să solicităm acum un domeniu de aplicare suplimentar din datele de conectare Microsoft.

Sub Configurarea din serviciul mobil, setați MS_MicrosoftScope în aplicații.

Ca urmare a acestei modificări, voi primi informațiile suplimentare pe care le-am solicitat după ce mă înregistrez din nou.

"id": "my-live-id", "nume": "Vivek Maskara", "first_name": "Vivek", "last_name": "https://profile.live .com / "," sex ": null," e-mailuri ": " preferat ":" [email protected] "," account ":" [email protected] "," personal " null, "locale": "en_US", "updated_time": "2015-03-10T16: 03: 43-08: 00"

Dacă utilizatorul este conectat prin intermediul unui cont Microsoft, acesta va trimite o solicitare API-urilor Live Connect, transferând tokenul stocat în obiectul identități utilizator. În cele din urmă, va analiza obiectul JSON returnat și va prelua detaliile profilului utilizatorului.

user.getIdentities (success: function (identities) var url; var oauth = null; if (identities.microsoft) var liveAccessToken = identities.microsoft.accessToken; url = 'https://apis.live.net/v5 (Err, resp., Corp) if (err || resp.statusCode! == 200) console.error ( "Eroare la trimiterea datelor la furnizor: ', err); request.respond (statusCodes.INTERNAL_SERVER_ERROR, corp); altceva try var userData = JSON.parse (body); item.userId = user.userId; item.display_name = userdata.name; item.user_email = userData.emails ['account']; request.execute (); catch (ex) console.error ('Eroare parsarea răspunsului API furnizor:', ex); răspuns (statusCodes.INTERNAL_SERVER_ERROR, ex); var var = cer ('request'); var reqOptions = uri: url, headers: Accept: "application / json";  altceva // Introduceți cu numele de utilizator implicit request.execute (););

Acum trebuie să modificăm scriptul de inserare pentru a insera o înregistrare nouă dacă un utilizator cu numele de utilizator nu există. Dacă există un utilizator, îl actualizăm. Puteți utiliza un script de tabel de la server pentru a verifica dacă există o înregistrare înainte de a termina operația de inserare.

Iată un exemplu de script care verifică dacă vreunul dintre elementele din tabel are o potrivire numele de utilizator valoare și, dacă este cazul, nu efectuează o inserție.

inserați funcția (element, utilizator, cerere) var table = tables.getTable ('UsersTable'); table.where (userId: user.userId) citiți (succes: upsertItem); funcția upsertItem (existingItems) if (existingItems.length === 0) request.execute ();  altceva item.id = existingItems [0] .id; table.update (element, succes: function (updatedItem) request.respond (200, updatedItem)); 

Acum putem combina ambele scripturi pentru a construi scriptul nostru final de inserare pentru UsersTable. Sub scenariu fila din UsersTable, înlocuiți scriptul de inserare cu următorul script:

inserați funcția (element, utilizator, cerere) item.display_name = ""(// userId: user.userId) citește (succes: upsertItem); funcția upsertItem (existingItems) if (existingItems.length === 0) user.getIdentities success: function (identities) var url; var oauth = null; if (identities.microsoft) var liveAccessToken = identities.microsoft.accessToken; url = 'https: (ifr = | resp.statusCode! == 200) Dacă varianta (url) var requestCallback = funcția (err, resp, corpul) if (err || resp.statusCode! ) console.error ("Eroare la trimiterea datelor către furnizor:", err); request.respond (statusCodes.INTERNAL_SERVER_ERROR, corp); altceva try var userData = JSON.parse (body); item.userId = user .exe (); catch (ex) console.error ('Eroare la parsarea răspunsului din API-ul furnizorului:'. , ex); request.respond (statusCodes.INTERNAL_SERVER_ERROR, ex); var req = requir e ( 'cerere'); var reqOptions = uri: url, anteturi: Accept: "application / json"; req (reqOptions, requestCallback);  altceva // Introduceți cu numele de utilizator implicit request.execute (); );  altfel // am actualizat utilizatorul cu valorile existente, dar ați putea introduce noi valori aici. item.id = existingItems [0] .id; item.userId = existingItems [0] .userId; element.display_name = existingItems [0] .display_name; item.user_email = existentItems [0] .user_email; item.profile_picture = existentItems [0] .profile_picture; table.update (element, succes: function (updatedItem) request.respond (200, updatedItem)); 

Acum, când am actualizat scriptul de inserare, orice apel pentru o operație de inserare va adăuga o înregistrare nouă dacă un utilizator cu un anumit numele de utilizator nu există. De asemenea, elementul de inserare este actualizat cu informații despre utilizator numele de utilizator, Nume, și e-mail.

Am adăugat o metodă InsertUser, care are un parametru utilizator de tip UsersTable și o introduce în tabel.

async privat Task InsertUser (utilizator UsersTable) await peopleTable.InsertAsync (user); 

După ce ați sunat la AuthenticateAsync metoda de a face clic pe buton, eu sunat InsertUser metoda de adăugare a utilizatorului la UsersTable.

așteaptă InsertUser (noul UserTable ProfilePicture = string.Empty);

Puteți rula aplicația în emulator pentru a vedea dacă funcționează. Când vă conectați pentru a doua oară, aplicația folosește tokenul de autentificare în memorie în loc să prezinte ecranul de autentificare.

Concluzie

Autentificarea utilizatorilor pentru diferiți furnizori de servicii de identitate utilizând serviciile Azure Mobile Services este destul de simplă. În acest tutorial am arătat cum poate fi folosit un cont Microsoft pentru autentificare. Procedura de folosire a altor furnizori de identitate este aceeași. Doar furnizor parametrul trebuie modificat în AuthenticateAsync apel. Se recomandă memorarea în cache a jetonului de autentificare, astfel încât utilizatorul să poată beneficia de autentificare unică.

Domeniile suplimentare de autentificare pot fi solicitate pentru a obține mai multe informații despre utilizatori. Acest articol MSDN discută despre cum se poate face pentru diverși furnizori de identitate. Simțiți-vă liber să descărcați fișierele sursă ale tutorialului pentru referință. Nu uitați să configurați aplicația să utilizeze serviciile Azure Mobile Services înainte de ao implementa.

Cod