Extending SharePoint Online met Windows 8 apps. Voorstellen.

Post on 01-Apr-2015

217 views 1 download

Tags:

Transcript of Extending SharePoint Online met Windows 8 apps. Voorstellen.

Extending SharePoint Online met Windows 8 apps

Michaël Hompus

Sander Bosman

VoorstellenMichaël HompusPrincipal developermichael.hompus@winvision.nl@eNeRGy164

Sander BosmanSenior developersander.bosman@winvision.nl@Sander_B

Voorstellen

Innovatieteam

Onderwijs Zorg Goede doelen

Agenda• Voorstellen• Doelstelling• Authenticatie• SharePoint interfaces• Windows 8 and beyond…

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

DEMO

Authenticatie

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

AD accounts in SharePoint OnlineWens: Medewerker moet met het bedrijfs-account (AD) kunnen inloggen op de app.

Oplossing: DirSyncVerschillende opties:• DirSync AD Accounts• DirSync AD Accounts met Wachtwoord

Same Sign-On

• DirSync AD Accounts i.c.m. ADFSSingle Sign-On

AD accounts in SharePoint Online

AD accounts in SharePoint Online

Authenticatie

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

DEMO

Authenticatie - Architectuur

https://login.microsoftonline.com/extSTS.srf

Authenticatie – Token Request

https://<tenant>.sharepoint.com

Sander Bosman
Sander Bosman

Authenticatie – Token Response

Authenticatie - Architectuur

https://login.microsoftonline.com/extSTS.srf

https://<tenant>.sharepoint.com/_forms/default.aspx?wa=wsignin1.0

Authenticatie – Login Request

Authenticatie – Login Response

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 – Data Request

Authenticatie – Data Response

Credentials opslaan in de app

Password Vault - Store

var passwordVault = new PasswordVault();var passwordCredentials = passwordVault.RetrieveAll(); foreach (var passwordCredential in passwordCredentials){ try { if (passwordCredential.Resource == WinvisionDosyeAccount && passwordCredential.UserName == credentials.Username) {

passwordVault.Remove(passwordCredential); } } catch (COMException) { // No password found }} var credential = new PasswordCredential(WinvisionDosyeAccount, credentials.Username, credentials.Password); passwordVault.Add(credential);

Password Vault - Retrievevar passwordVault = new PasswordVault();var credentials = passwordVault.RetrieveAll();

foreach (var passwordCredential in credentials){ try { if (passwordCredential.Resource != WinvisionDosyeAccount) {

continue; }  passwordCredential.RetrievePassword();  return new Credentials

{ Username = passwordCredential.UserName, Password = passwordCredential.Password,

}; } catch (COMException) { // No password found }}

Credential Manager

SharePoint interfaces

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• Silverlight client object model• JavaScript client object model• .NET Framework client object model• Mobile client object model• REST/OData endpoints• Web Services• Remote Procedure Call

SharePoint lijsten

SharePoint lijstenWCF Data Services• LINQ queries tegen databron• …/_vti_bin/listdata.svc• WCF Data Services Tools for Windows Store Appshttp://www.microsoft.com/en-us/download/details.aspx?id=30714

Standaard niet awaitable• Async extension methods for DataServiceContexthttps://gist.github.com/Phanatic/3427256

var context = new InnovatieDataContext(new Uri(string.Format("{0}/_vti_bin/listdata.svc", this.settingsService.GetSharePointUri())));context.SendingRequest += this.ContextOnSendingRequest;

var result = new List<Customer>();

var query = (DataServiceQuery<Customer>)context.Klanten.Select(c => new Customer { 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 });

var customers = await query.ExecuteAsync();

result.AddRange(customers);

SharePoint lijstenCookie moet meegegeven worden

private void ContextOnSendingRequest(object sender, SendingRequestEventArgs sendingRequestEventArgs){

sendingRequestEventArgs.RequestHeaders["Cookie"] = this.settingsService.GetCookieContainer();}

SharePoint lijstenIssue:• Veldnamen in queries zijn taalafhankelijk• Na enige inactiviteit regeert SharePoint Online op het eerste request altijd in het Engels!• DataServiceClientException

Managed metadata

Managed metadataKan je niet ophalen met listdata.svc

REST API• …/_api/• HttpClient

/_api/web/lists/getbytitle('Referenties')/Items?$select=Id,Microsoft_x0020_technieken

Managed metadata• Cookie moet meegegeven worden• JSON.NET om resultaten te verwerken

var cookieContainer = new CookieContainer();cookieContainer.SetCookies(new Uri(this.settingsService.GetSharePointUri()), cookieHeader);

var client = new HttpClient(new HttpClientHandler { CookieContainer = cookieContainer });client.DefaultRequestHeaders.Add("Cookie", cookieHeader);client.DefaultRequestHeaders.Accept.ParseAdd("application/json;odata=verbose");

var response = await client.GetStringAsync( string.Format("{0}/_api/web/lists/getbytitle('Referenties')/Items? $select=Id,Microsoft_x0020_technieken", this.settingsService.GetSharePointUri()));

var json = JObject.Parse(response);

var managedMetadata = from i in json["d"]["results"].Children().Where(g => g["Microsoft_x0020_technieken"]["results"].Any()) select new { Id = (int)i["Id"], Labels = i["Microsoft_x0020_technieken"]["results"].Values<string>("Label").ToArray() };

var microsoftTechnologies = managedMetadata.ToDictionary(m => m.Id, m => m.Labels);

Bestanden

Bestanden

Bestanden

Attachments = c.Bijlagen.Select(b => new Attachment { Title = b.Name, SharePointPath = string.Format("{0}/Lists/{1}/Attachments/{2}/{3}",

this.settingsService.GetSharePointUri(), b.EntitySet, b.ItemId, b.Name)

}),

Bestanden

var cookieContainer = new CookieContainer();cookieContainer.SetCookies(new Uri(this.settingsService.GetSharePointUri()), cookieHeader);

var buffer = new byte[] { }

using (var client = new HttpClient(new HttpClientHandler { CookieContainer = cookieContainer })){ buffer = await client.GetByteArrayAsync(uri);}

var images = await ApplicationData.Current.LocalFolder.CreateFolderAsync(folder, CreationCollisionOption.OpenIfExists);var file = await images.CreateFileAsync(cacheKey, CreationCollisionOption.ReplaceExisting);

await FileIO.WriteBytesAsync(file, buffer);

“run-with-cookies”

UitdagingenAlles 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

“run-with-cookies”Start

Lees cookie uit opgeslagen settings

Is er een cookie?

Remote Request

Is er een fout opgestreden?

Done

Wordt er al een cookie opgehaald

J a

J a

Nee

Haal cookie op en sla op in settings

Nee Nee

Is het de Office 365 bug?

Is het cookie verlopen?

J a

J a Nee

J a

Nee

Exception

Windows 8 and beyond

Andere devicesUniversal apps• Windows 8.1 update• Windows Phone 8.1• Xbox One

DEMO

Windows 8.1 app

Make universal

Windows Phone 8.1

Andere devicesXamarin• Android• iOS

DEMO

Android

Vragen?

THANK YOU