60
Build and Deploy Provider-hosted SharePoint Add-ins @dannyjessee #SPSDC October 3, 2015

Build and Deploy Provider-hosted SharePoint Add-ins

Embed Size (px)

Citation preview

Page 1: Build and Deploy Provider-hosted SharePoint Add-ins

Build and Deploy Provider-hosted SharePoint Add-ins

@dannyjessee#SPSDCOctober 3, 2015

Page 2: Build and Deploy Provider-hosted SharePoint Add-ins

Housekeeping…• Download EventBoard Mobile and remember to fill out session

evaluations…• http://app.spsdc.org

• Phasers set to stun, mobile devices set to silent…• You must be present to win at the wrap-up…

Page 3: Build and Deploy Provider-hosted SharePoint Add-ins

Thanks to our Sponsors!!!

Page 4: Build and Deploy Provider-hosted SharePoint Add-ins

Join us at #SharePint sponsored by Kemp Technologies at World of Beer of Reston in the Towncenter just across the bridge

Why? To network with fellow SharePoint professionalsWhat? SharePint!!!When? 6:15 PMWhere? World of Beer Reston1888 Explorer StreetReston, VA 20190

Thanks toKemp Technologies

Page 5: Build and Deploy Provider-hosted SharePoint Add-ins

We’re hiring!fulcrumco.com/careers

Passed examsSharePoint 201370-331, 70-33270-488, 70-489

[email protected]

Sr. SharePointDeveloperFulcrumWashington, DC metro area

Who Am I?

Photo courtesy Marie Sly | mariesly.com

@dannyjessee

Page 6: Build and Deploy Provider-hosted SharePoint Add-ins

Agenda Intro to provider-hosted Add-ins SharePoint Add-in development tools Accessing SharePoint data remotely Authentication and authorization for SharePoint Add-ins

Deploying provider-hosted Add-ins

Page 7: Build and Deploy Provider-hosted SharePoint Add-ins

Before we go too far… You may have heard of “apps for SharePoint”

Around May 2015, Microsoft began publicizing the name change to “SharePoint Add-ins”

Great “cheat sheet” at http://www.jeremythake.com/2015/06/office-365-app-model-rename-cheat-sheet

Page 8: Build and Deploy Provider-hosted SharePoint Add-ins

Intro to provider-hosted Add-ins

Page 9: Build and Deploy Provider-hosted SharePoint Add-ins

Types of SharePoint Add-ins SharePoint-hosted

Good for very simple solutions (100% client-side code) Can be deployed on-premises or to SharePoint Online in Office 365

Provider-hosted Server-side code deployed to the cloud or a different on-

premises server Hybrid approaches possible

Some components in SharePoint with others in the cloud

Page 10: Build and Deploy Provider-hosted SharePoint Add-ins

Provider-hosted Add-ins Add-in components can be hosted anywhere (cloud or on-premises) Including Windows Azure Web Sites

Authorized using OAuth or the JavaScript cross-domain library

Can use ANY implementation language (ASP.NET, PHP, etc.)

Page 11: Build and Deploy Provider-hosted SharePoint Add-ins

Host, Add-in, and remote webs Each Add-in is deployed to a SharePoint site known as the host web

Add-in web provisioned with Add-in installation https://[Add-in prefix][hash].[Add-in domain]/[relative site URL]/[Add-

in name] Required for SharePoint-hosted Add-ins, optional for provider-hosted

Add-ins (but required if you want to leverage the JavaScript cross-domain library)

Each Add-in installation has its own unique URL Provider-hosted Add-ins also have a remote web Server-side code can run here

Page 12: Build and Deploy Provider-hosted SharePoint Add-ins

Host, Add-in, and remote webs

Image from http://msdn.microsoft.com/en-us/library/fp179925.aspx

Host web

Add-in web

Remote web

Page 13: Build and Deploy Provider-hosted SharePoint Add-ins

Add-in user experiences Immersive full page

Required in every Add-in, whether you need it or not (landing page) Lives in remote web for provider-hosted Add-in (can use SharePoint

chroming) Add-in part

Like a web part; hosted in an IFRAME (can point to content in remote web)

UI custom actions (declarative)

Image from http://msdn.microsoft.com/en-us/library/fp179930.aspx

Page 14: Build and Deploy Provider-hosted SharePoint Add-ins

Styling full page Add-ins Client chrome control can give the basic look and feel of the SharePoint host web$(document).ready(function () { hostweburl = decodeURIComponent(getQueryStringParameter("SPHostUrl")); $.getScript(hostweburl + "/_layouts/15/SP.UI.Controls.js", renderChrome);});

function renderChrome() { var options = { "appIconUrl": decodeURIComponent(getQueryStringParameter("SPHostLogoUrl")), "appTitle": "CSOM/JSOM/REST demos", "onCssLoaded": "chromeLoaded()" }; // Place the chrome control in the <div> with ID="chrome_ctrl_placeholder" var nav = new SP.UI.Controls.Navigation("chrome_ctrl_placeholder", options); nav.setVisible(true);}

Page 15: Build and Deploy Provider-hosted SharePoint Add-ins

Styling full page Add-ins Before/after client chrome control

Page 16: Build and Deploy Provider-hosted SharePoint Add-ins

SharePoint Add-in development tools

Page 17: Build and Deploy Provider-hosted SharePoint Add-ins

Add-in development tools Office developer tools for Visual Studio http://aka.ms/officedevtoolsforvs2013

Page 18: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio <F5> deploy/debug experience

IIS Express/LocalDB Add components to Add-in project

Provider-hosted Add-ins include ASP.NET project Web Forms and MVC supported (can convert existing projects to Add-

ins)

Page 19: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio

Page 20: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio

Page 21: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio

Page 22: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio

Page 23: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio ASP.NET web application projects include classes to handle Add-in AuthN and AuthZ (using OAuth)

SharePointContext.cs Functions to manage SharePoint context across page requests Can create user and/or Add-in contexts for Add-in and/or host webs

TokenHelper.cs Functions to create and obtain ContextToken and AccessToken

objects On other platforms, you have to do the OAuth implementation and manage tokens yourself

Page 24: Build and Deploy Provider-hosted SharePoint Add-ins

Office dev tools for Visual Studio Convert existing web application project to a SharePoint Add-in project

Page 25: Build and Deploy Provider-hosted SharePoint Add-ins

Demo:Hello World Add-in using Visual Studio with Office Dev Tools

Page 26: Build and Deploy Provider-hosted SharePoint Add-ins

Accessing SharePoint data remotely

Page 27: Build and Deploy Provider-hosted SharePoint Add-ins

Access SharePoint data remotely .NET Managed client object model (CSOM) JavaScript client object model (JSOM) REST endpoints with OData

Can be called via server-side or client-side code Data can be returned in Atom XML or JSON format

Page 28: Build and Deploy Provider-hosted SharePoint Add-ins

.NET Managed CSOM When you create a SharePoint Add-in project, references to the .NET Framework assemblies are automatically added to the project {SharePointRoot}\ISAPI\Microsoft.SharePoint.Client.Runtime.dll {SharePointRoot}\ISAPI\Microsoft.SharePoint.Client.dll

Other CSOM assemblies you may need: …DocumentManagement.dll, …Publishing.dll, …Search.dll, …

Taxonomy.dll, …UserProfiles.dll Add the following statement to your code-behind:

using Microsoft.SharePoint.Client;

Page 29: Build and Deploy Provider-hosted SharePoint Add-ins

.NET Managed CSOMFollow these steps:

1. Create a ClientContext object, passing in the URL of a SharePoint site

2. Call the Load() function to build the request query for any value properties your application needs to access

3. Execute the query by calling the ExecuteQuery() function

var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);using (var clientContext = spContext.CreateUserClientContextForSPHost()){ clientContext.Load(clientContext.Web, web => web.Title); clientContext.ExecuteQuery(); Response.Write(clientContext.Web.Title);}

Page 30: Build and Deploy Provider-hosted SharePoint Add-ins

JavaScript client object model Add a reference to the JavaScript client object model (JSOM) using HTML <script> tags Reference the host web URL because the app web may not exist in

every scenario in provider-hosted Add-ins Reference the following libraries, in this order:

1. ASP.NET AJAX library (MicrosoftAjax.js)2. jQuery (optional)3. SP.Runtime.js file4. SP.js file5. SP.RequestExecutor.js file (cross-domain library)

Page 31: Build and Deploy Provider-hosted SharePoint Add-ins

JavaScript client object model<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script><script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.3.min.js" type="text/javascript"></script><script type="text/javascript">var hostweburl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));var appweburl = decodeURIComponent(getQueryStringParameter("SPAppWebUrl"));var scriptbase = hostweburl + "/_layouts/15/";$.getScript(scriptbase + "SP.Runtime.js", function () { $.getScript(scriptbase + "SP.js", function () { $.getScript(scriptbase + "SP.RequestExecutor.js", execRequests); }); });

Page 32: Build and Deploy Provider-hosted SharePoint Add-ins

JavaScript client object modelfunction execRequests() { var clientContext = new SP.ClientContext(appweburl); var factory = new SP.ProxyWebRequestExecutorFactory(appweburl); clientContext.set_webRequestExecutorFactory(factory); var appWeb = clientContext.get_web(); appWebListColl = appWeb.get_lists(); clientContext.load(appWebListColl); clientContext.executeQueryAsync(onAppWebGetListSuccess, onJSOMError);

var appContextSite = new SP.AppContextSite(clientContext, hostweburl); var hostWeb = appContextSite.get_web(); hostWebListColl = hostWeb.get_lists(); clientContext.load(hostWebListColl); clientContext.executeQueryAsync(onHostWebGetListSuccess, onJSOMError);}

Page 33: Build and Deploy Provider-hosted SharePoint Add-ins

REST endpoints with OData SharePoint 2013 provides a Representational State Transfer (REST) web service that leverages the OData protocol (http://odata.org)

Construct HTTP requests to specially crafted URLs to access and manipulate SharePoint data Responses to these HTTP requests can be returned in Atom or JSON

format Can be used with CSOM, JSOM, or any other stack No external assembly references required!

Page 34: Build and Deploy Provider-hosted SharePoint Add-ins

REST endpoints with OData

URL Returns_api/web/title The title of the current site_api/web/lists/getByTitle('Announcements') The Announcements list_api/web/lists/getByTitle('Announcements')/fields

The columns in the Announcements list

_api/web/lists/getByTitle('Tasks')/items The items in the Tasks list_api/web/siteusers The users in the site_api/web/sitegroups The user groups in the site_api/web/GetFolderByServerRelativeUrl('/Shared Documents')

The root folder of the Shared Documents library

_api/web/GetFolderByServerRelativeUrl('/Plans')/Files('a.txt')/$value

The file a.txt from the Plans library

Table adapted from http://msdn.microsoft.com/en-us/magazine/dn198245.aspx

Example read (GET) request URLs

Page 35: Build and Deploy Provider-hosted SharePoint Add-ins

REST endpoints with OData To get the title of my SharePoint site, construct an HTTP GET request to the following URL:https://djsp.sharepoint.com/_api/web/title

Returned data (if authorized):<?xml version="1.0" encoding="UTF-8"?><d:Title xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:gml="http://www.opengis.net/gml"xmlns:georss="http://www.georss.org/georss" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">Danny's O365 Dev Tenant</d:Title>

Page 36: Build and Deploy Provider-hosted SharePoint Add-ins

CSOM vs. REST Generally a matter of personal preference

CSOM RESTLess “chatty” (requests can be batched) More “chatty” (request batching can only

be done in Office 365, not on-premises)Handles the “plumbing” of calls to SharePoint

Requires you to construct and manage your own HTTPRequest/Response objects

Requires CAML for queries Uses standard OData vocabulariesCan interact with managed metadata taxonomies and workflows

No support for interacting with managed metadata taxonomies and workflowsEasy to leverage third-party libraries (jQuery)Can be debugged using FiddlerNo external assembly references required Table adapted from

http://www.andrewconnell.com/blog/sharepoint-2013-csom-vs.-rest-...-my-preference-and-why

Page 37: Build and Deploy Provider-hosted SharePoint Add-ins

Authentication and authorization forAdd-ins

Page 38: Build and Deploy Provider-hosted SharePoint Add-ins

Authentication and authorization SharePoint Add-ins have distinct identities

Associated with an Add-in principal (just like users have user principals)

OAuth tokens are used to pass Add-in identity

Add-in principal can be granted permissions Add-ins must request permissions to the host web Always has Full Control to the Add-in web

Page 39: Build and Deploy Provider-hosted SharePoint Add-ins

Add-in permissions Add-in manifest must include requests for the scope at which permissions are needed and the permission needed within that scope

Scopes: Permissions:

Page 40: Build and Deploy Provider-hosted SharePoint Add-ins

Add-in authorization policy types User-only

Only the user identity is considered (typical user interactions with SharePoint)

Add-in + User Both the user identity and the Add-in identity are considered “Access denied” if either the user or the Add-in lacks permissions

Add-in-only Only the Add-in identity is considered Allows for elevation above current user’s permissions (or when there

is no current user) Only supported for server-side code in provider-hosted Add-ins Can’t be used with certain APIs (e.g., Project Server, Search)

Page 41: Build and Deploy Provider-hosted SharePoint Add-ins

Add-in permissions Trust must be explicitly granted by the user installing the Add-in (all or nothing)

User installing the Add-in must also have all permissions the Add-in is requesting

Page 42: Build and Deploy Provider-hosted SharePoint Add-ins

OAuth in SharePoint 2013 OAuth 2.0 is an open protocol for authorization http://tools.ietf.org/html/draft-ietf-oauth-v2-22

Enables users to authorize the service provider (in this case, SharePoint 2013) to provide tokens instead of credentials

OAuth is used: To authenticate Add-ins in the Office Store, an Add-in catalog, or a

developer tenant To authorize requests by a SharePoint Add-in to access SharePoint

resources on behalf of a user

Page 43: Build and Deploy Provider-hosted SharePoint Add-ins

OAuth in SharePoint 2013 Windows Azure Access Control Service (ACS) acts as the authorization server for provider-hosted Add-ins

The provider-hosted Add-in uses OAuth to authenticate with SharePoint 2013 SharePoint requests a context token from ACS that it can send to

the provider-hosted Add-in’s server (contains a refresh token) The provider-hosted Add-in’s server uses the refresh and context

tokens (along with its client ID & secret values) to request an access token from ACS

The provider-hosted Add-in’s server then uses the access token to talk back to SharePoint

Page 44: Build and Deploy Provider-hosted SharePoint Add-ins

JavaScript cross-domain library An Add-in that includes a remote web that uses JavaScript for its data access logic likely has to make client-side calls across domains azurewebsites.net (remote web domain) sharepoint.com (host web

domain) By using the cross-domain library (SP.RequestExecutor.js), the pages in your remote web can make client side calls to the SharePoint host and/or Add-in webs on a different domain without the browser blocking them

Page 45: Build and Deploy Provider-hosted SharePoint Add-ins

JavaScript cross-domain library Uses a hidden <iframe> and a client-side proxy page hosted in SharePoint to enable client-side communication using JavaScript Both domains must be in the same IE security zone

Your provider-hosted Add-in must provision an Add-in web in order to use the cross-domain library Can contain just an empty page or list, but the Add-in web must

exist in addition to the remote web

Page 46: Build and Deploy Provider-hosted SharePoint Add-ins

OAuth vs. JS cross-domain libraryRequirement/Scenario OAuth Cross-

domainI use client-side technologies (HTML + JavaScript).I want to use REST interfaces.There is a firewall between SharePoint and my remote Add-in, and I need to issue the calls through the browser.My Add-in needs to access resources as the logged-on user.My Add-in needs to elevate privileges to other than those of the current logged-on user.My Add-in needs to act on behalf of a user other than the one who is logged on.My Add-in needs to perform operations only while the user is logged on.My Add-in needs to perform operations even when the user is not logged on. Table from http://

msdn.microsoft.com/en-us/library/fp179897.aspx

Page 47: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying provider-hosted Add-ins

Page 48: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins To use OAuth, you must register an Add-in principal Automatically handled for <F5> localhost deployments Go to /_layouts/15/AppRegNew.aspx for provider-hosted Add-ins

Page 49: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins Update <appSettings> values in web.config<add key="ClientId" value="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /><add key="ClientSecret" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=" />

Set full URL for Start page in AppManifest.xml

Page 50: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins Right-click and “Publish…” the Add-in project

Page 51: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins

Page 52: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins Click Package the app to generate .app file

Page 53: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins

Page 54: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins Deploy the .app file to your Add-in catalog

Page 55: Build and Deploy Provider-hosted SharePoint Add-ins

Deploying Add-ins Click the link to launch the Add-in Grant permissions the Add-in requests

Page 56: Build and Deploy Provider-hosted SharePoint Add-ins

Demo:Securely accessing SharePoint data from provider-hosted Add-ins,deploying a provider-hosted Add-in, & Add-in authorization policy types

Page 57: Build and Deploy Provider-hosted SharePoint Add-ins

Start building SharePoint Add-ins Office 365 developer site

http://msdn.microsoft.com/en-us/library/fp179924%28v=office.15%29

Free 30-day trial Visual Studio Ultimate/Premium MSDN subscribers get 1-year

subscription (otherwise costs $99/year) Plan E1 or E3 subscribers can provision a developer site from the

Admin Center CloudShare

http://cloudshare.com SharePoint 2013 environments have Visual Studio 2013 Ultimate

preinstalled Azure IaaS (MSDN subscription benefit)

https://manage.windowsazure.com

Page 58: Build and Deploy Provider-hosted SharePoint Add-ins

Conclusion Microsoft has made significant improvements to the developer experience in SharePoint 2013 Almost anything you can do in the server-side object model can now

be done through CSOM, JSOM, REST/OData endpoints Expect continued enhancements to this model in SharePoint 2016 (this is not going away)

Provider-hosted Add-ins allow business logic to be executed on an external server (IIS, Azure, etc.)

Don’t run your server-side code in SharePoint!

Page 59: Build and Deploy Provider-hosted SharePoint Add-ins

Questions?

Page 60: Build and Deploy Provider-hosted SharePoint Add-ins

Thank you!@[email protected]/bloggithub.com/dannyjessee/add-in-model