570 likes | 728 Views
Michaël Hompus Sander Bosman. Extending SharePoint Online met Windows 8 apps . Voorstellen. Michaël Hompus Principal developer michael.hompus@winvision.nl @eNeRGy164. Sander Bosman Senior developer sander.bosman@winvision.nl @ Sander_B. Voorstellen. Onderwijs. Zorg. Goede doelen.
E N D
Michaël Hompus Sander Bosman Extending SharePoint Online met Windows 8 apps
Voorstellen Michaël Hompus Principaldeveloper michael.hompus@winvision.nl @eNeRGy164 Sander Bosman Senior developer sander.bosman@winvision.nl @Sander_B
Voorstellen Onderwijs Zorg Goede doelen Innovatieteam
Agenda • Voorstellen • Doelstelling • Authenticatie • SharePoint interfaces • Windows 8 andbeyond…
Doelstelling • Als bedrijf willen we een centrale plek om informatie over onze projecten en referenties gemakkelijk bij te kunnen houden • Als een medewerker van het bedrijf wil ik een Windows 8 app zodat ik onderweg informatie over projecten en referenties kan opzoeken ook als ik geen dataverbinding heb
Authenticatie • Hoe krijg je bedrijfsaccounts in SharePoint Online? • Hoe kan je authenticeren tegen SharePoint Online vanuit een Windows 8 app? • Hoe sla je credentials op in een Windows 8 app
AD accounts in SharePoint Online Wens: Medewerker moet met het bedrijfs-account (AD) kunnen inloggen op de app. Oplossing:DirSync Verschillende opties: • DirSync AD Accounts • DirSync AD Accounts met Wachtwoord Same Sign-On • DirSync AD Accounts i.c.m. ADFS Single Sign-On
Authenticatie - Architectuur https://login.microsoftonline.com/extSTS.srf https://<tenant>.sharepoint.com/_forms/default.aspx?wa=wsignin1.0 https://<tenant>.sharepoint.com/_vti_bin/ListData.svc
Authenticatie - Meer informatie • How to do active authentication to Office 365 and SharePoint Online - Wictor Wilén http://www.wictorwilen.se/Post/How-to-do-active-authentication-to-Office-365-and-SharePoint-Online.aspx
Authenticatie - Architectuur https://login.microsoftonline.com/extSTS.srf
Authenticatie – Token Request https://<tenant>.sharepoint.com
Authenticatie - Architectuur https://login.microsoftonline.com/extSTS.srf https://<tenant>.sharepoint.com/_forms/default.aspx?wa=wsignin1.0
Authenticatie - Architectuur https://login.microsoftonline.com/extSTS.srf https://<tenant>.sharepoint.com/_forms/default.aspx?wa=wsignin1.0 https://<tenant>.sharepoint.com/_vti_bin/ListData.svc
Password Vault - Store varpasswordVault = newPasswordVault(); varpasswordCredentials = passwordVault.RetrieveAll(); foreach (varpasswordCredentialinpasswordCredentials) { try { if (passwordCredential.Resource == WinvisionDosyeAccount && passwordCredential.UserName == credentials.Username) { passwordVault.Remove(passwordCredential); } } catch (COMException) { // No password found } } var credential = newPasswordCredential(WinvisionDosyeAccount, credentials.Username, credentials.Password); passwordVault.Add(credential);
Password Vault - Retrieve varpasswordVault = newPasswordVault(); var credentials = passwordVault.RetrieveAll(); foreach (varpasswordCredentialin credentials) { try { if (passwordCredential.Resource != WinvisionDosyeAccount) { continue; } passwordCredential.RetrievePassword(); returnnewCredentials { Username = passwordCredential.UserName, Password = passwordCredential.Password, }; } catch (COMException) { // No password found } }
SharePoint interfaces • Welke SharePoint interfaces kan ik gebruiken • Hoe kan ik lijsten, managed metadata en bestanden opvragen • Welke voor- en nadelen hebben de verschillende interfaces
SharePoint interfaces • Server object model • Silverlightclient object model • JavaScriptclient object model • .NET Framework client object model • Mobile client object model • REST/ODataendpoints • Web Services • Remote Procedure Call
SharePoint lijsten WCF Data Services • LINQ queries tegen databron • …/_vti_bin/listdata.svc • WCF Data Services Tools for Windows Store Apps http://www.microsoft.com/en-us/download/details.aspx?id=30714 Standaard niet awaitable • Async extension methods for DataServiceContext https://gist.github.com/Phanatic/3427256
SharePoint lijsten Cookie moet meegegeven worden • var context = newInnovatieDataContext(newUri(string.Format("{0}/_vti_bin/listdata.svc", this.settingsService.GetSharePointUri()))); • context.SendingRequest += this.ContextOnSendingRequest; • varresult = newList<Customer>(); • var query = (DataServiceQuery<Customer>)context.Klanten.Select(c => newCustomer • { • Id = c.Id, • Name = c.Titel, • AccountManagerId = c.AccountManagerId, • ServiceManagerId = c.ServiceManagerId, • VerticalId = c.VerticalId, • LogoPath = c.Logo, • Telephone = c.Telefoonnummer, • Website = c.Website, • Email = c.Email • }); • varcustomers = awaitquery.ExecuteAsync(); • result.AddRange(customers); privatevoidContextOnSendingRequest(objectsender, SendingRequestEventArgssendingRequestEventArgs) { sendingRequestEventArgs.RequestHeaders["Cookie"] = this.settingsService.GetCookieContainer(); }
SharePoint lijsten Issue: • Veldnamen in queries zijn taalafhankelijk • Na enige inactiviteit regeert SharePoint Online op het eerste request altijd in het Engels! • DataServiceClientException
Managed metadata Kan je niet ophalen met listdata.svc REST API • …/_api/ • HttpClient /_api/web/lists/getbytitle('Referenties')/Items?$select=Id,Microsoft_x0020_technieken
Managedmetadata • Cookie moet meegegeven worden • JSON.NET om resultaten te verwerken varcookieContainer = newCookieContainer(); cookieContainer.SetCookies(newUri(this.settingsService.GetSharePointUri()), cookieHeader); varclient = newHttpClient(newHttpClientHandler { CookieContainer = cookieContainer }); client.DefaultRequestHeaders.Add("Cookie", cookieHeader); client.DefaultRequestHeaders.Accept.ParseAdd("application/json;odata=verbose"); var response = awaitclient.GetStringAsync( string.Format("{0}/_api/web/lists/getbytitle('Referenties')/Items? $select=Id,Microsoft_x0020_technieken", this.settingsService.GetSharePointUri())); • varjson = JObject.Parse(response); • varmanagedMetadata = from i injson["d"]["results"].Children().Where(g => g["Microsoft_x0020_technieken"]["results"].Any()) • selectnew • { • Id = (int)i["Id"], • Labels = i["Microsoft_x0020_technieken"]["results"].Values<string>("Label").ToArray() • }; • varmicrosoftTechnologies = managedMetadata.ToDictionary(m => m.Id, m => m.Labels);
Bestanden Attachments = c.Bijlagen.Select(b => newAttachment { Title = b.Name, SharePointPath = string.Format("{0}/Lists/{1}/Attachments/{2}/{3}", this.settingsService.GetSharePointUri(), b.EntitySet, b.ItemId, b.Name) }),
Bestanden varcookieContainer = newCookieContainer(); cookieContainer.SetCookies(newUri(this.settingsService.GetSharePointUri()), cookieHeader); • var buffer = newbyte[] { } using (varclient = newHttpClient(newHttpClientHandler { CookieContainer = cookieContainer })) { buffer = awaitclient.GetByteArrayAsync(uri); } • var images = awaitApplicationData.Current.LocalFolder.CreateFolderAsync(folder, CreationCollisionOption.OpenIfExists); • var file = awaitimages.CreateFileAsync(cacheKey, CreationCollisionOption.ReplaceExisting); • awaitFileIO.WriteBytesAsync(file, buffer);
Uitdagingen Alles in Windows 8 Async • Wat doe je als je nog geen cookie hebt • Wat doe je als je cookie is verlopen • Met meerdere requests tegelijk • Met meerdere technieken • DataContext • HttpClient • En met mogelijke fouten die optreden
Andere devices Universal apps • Windows 8.1 update • Windows Phone 8.1 • Xbox One