Serviciile Azure Mobile vă permit să autentificați utilizatorii din aplicațiile Windows universale. În acest tutorial, veți învăța cum să:
numele de utilizator
nu există și altfel actualizați utilizatorul existentUrmătorii pași sunt necesari pentru a activa autentificarea în aplicația dvs.:
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.
Pentru a utiliza Live Connect ca furnizor de autentificare pentru Azure Mobile Services, urmați acești pași.
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.
Rezervați un Numele aplicatiei și faceți clic pe Salvați. Aplicația va fi afișată în Magazinul Windows sub acest nume.
Pe Servicii pagina, faceți clic pe Servicii live sub Windows Azure Mobile Services.
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.
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..
Odată ce v-ați înregistrat aplicația la furnizorul de identitate, trebuie să configurați Azure Mobile Services utilizând portalul Azure Management.
Conectați-vă la Portalul de administrare Azure, faceți clic pe Servicii mobile, și selectați aplicația.
Sub Apăsați , introduceți fila Secretul clientului și Pachetul SID valori și faceți clic pe Salvați.
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.
Utilizând portalul Azure Management, putem seta permisiunile tabelului pentru a restricționa accesul numai la utilizatorii conectați.
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.
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.
Apoi, trebuie să configurați aplicația Windows Phone 8.1 WinRT pentru a utiliza Azure Mobile Services.
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.
Apoi, adăugați Windows Azure Mobile Services SDK utilizând managerul de pachete NuGet.
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.
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;
Apoi, vom adăuga autentificarea utilizatorului înainte de a solicita orice resurse de la serviciul mobil.
Declarați o variabilă membră globală la Pagina principală
pentru stocarea utilizatorului autentificat.
utilizator privat MobileServiceUser;
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);
Î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.
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;
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 ();
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:
PasswordVault
.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.
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.
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.