2019年一月30日星期三

使用C#Azure函数的SharePoint网站设计和PnP模板的端到端指南-第2部分

本文是我微型系列文章的续篇,该系列文章是使用网站设计和PnP模板为SharePoint网站或Microsoft Team创建自定义模板的。重点在于C#函数的使用,因为Microsoft的文档显示了PowerShell的使用,由于Azure Functions v2不支持PowerShell,因此将来不太可能成为选择。在本系列中:

  1. Part 1 - Azure 队列, app 注册, Flow, Site Design and Site Script
  2. 第2部分-Azure功能,密钥保管库,启用托管服务身份和PnP模板[本文]
配置Azure功能进行身份验证
因此,我们在上一篇文章中创建了Function应用程序,但是那里没有代码-我们仍然需要执行一些配置。它在2019年初仍在预览中,但是我选择使用Azure Key Vault和Azure Functions应用程序设置之间的集成来存储凭据(在这种情况下为应用程序ID和应用程序密钥)。这是将凭据存储在Key Vault中的事情,但是您无需编写任何特殊代码即可获取它们(或者实际上是修改已拥有的任何Azure Function代码)-而是在应用设置中使用令牌指向密钥库中的项目。见"应用程序设置的关键保管库参考" section of 使用Azure功能和App Service简化无服务器和Web应用程序的安全性。通常,与将凭据存储在“应用程序设置”中相比,这是处理凭据的一种更好的方法,因为您可以精确控制 WHO 可以访问他们–就使用Azure和Azure中的THINGS的用户而言(例如特定的App Services或具有托管服务身份的其他任何内容)。

第1步– enable Managed Service 身分识别 for your Function app
  1. 在Azure门户中,转到“Platform features”功能应用程序区域,然后找到“Identity” item:
  2. 启用“system assigned” managed identity:
  3. 请点击“Save”然后确认出现的消息:
  4. 您r Function app’的受管理身份现在将被注册:
第2步-将凭据添加到Key Vault并授予访问权限
I’我将略略浏览一下,但完整文档位于 //docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references 如果需要的话。
  1. First, add the 客户编号 and Client Secret for your SharePoint app 注册 as secrets in the Key Vault. (N.B. If you don’您的Azure订阅中已经没有Key Vault实例,您’需要创建一个)。选择您喜欢的任何名称,但我的看起来像这样:
  2.           
  3. 对于每一个,我都需要获取完整的标识符。通过单击每个秘密的当前版本来执行此操作’ve创建了它,并找到了“Secret Identifier” property:
  4. 复制这些URI值,就像我们’一会儿需要它们。
  5. 接下来,向您的Azure Function授予对这些机密的访问权限。仍在Key Vault区域中,进入“Access policies” area:
  6. 添加一个new policy:
  7. 首先,选择主体–在这里,您正在按名称搜索Azure Function应用程序:

    然后:
     
  8. 请点击the “Select” button once you’ve found it.
  9. 现在我们修改“Secret permissions”:
  10. 检查“Get” option:
  11. 最后,点击“OK”确认权限:
步骤3-添加应用设置以指向密钥保管库条目
在我的功能的应用程序设置中,我需要使用以下约定 @ Microsoft.KeyVault(SecretUri =secret_uri_with_version) 指向我安全存储在Key Vault中的凭据。因此,在前面的步骤中获得了每个秘密的URI之后,我添加了类似的条目以及代码中使用的“应用设置”键名称。每一个的价值 secret_uri_with_version 是适当机密的URI:



Azure功能
最后一部分是Azure函数-核心代码如下,但是您也可以 从最后链接的Github项目下载完整项目。有关代码的一些注意事项:
  • 如前一篇文章所述,我们’重新使用SharePoint仅应用程序身份验证与SharePoint通讯-身份验证代码反映了这一点。如果您选择对证书使用仅AAD应用程序身份验证,则需要使用其他PnP AuthenticationManager方法
  • 我使用一个单独的类来略微抽象出Client ID和Client Secret,但这只是一个每个都有一个属性的类。随意创建一个,或者只使用局部变量
总体而言,这里没有什么太复杂的,但是我发现始终需要参考,以了解在Azure中运行所有内容时如何选择PnP模板文件的位置。代码中的路径与发布到Azure Function应用程序的Visual Studio项目中的内容一致:

PnP模板
为了完整起见,这里有一个简单的PnP模板来说明集成-它提供了一个现代的主页,其中包含特定的Web部件,内容类型和文档库,并在Web属性包中添加了一个条目:

结果

一切就绪后,您将为组织建立一个强大的自助团队或SharePoint网站配置流程-您可以在网站设计和PnP模板之间以几乎任何可能的方式配置网站。
要与Teams / Office 365组一起使用,您可以设置要应用于团队网站的默认网站设计,然后将调用您的模板。对于独立的SharePoint网站,用户可以从SharePoint主页请求一个新网站:

您r custom Site Design will appear in the list:

..然后收集该站点的详细信息:

一旦用户点击“Create site”按钮,将创建网站,并且Office 365将指示正在进行网站设计和相关的模板制作:




几秒钟后,该站点将可用,并且您的站点设计和PnP模板都将被应用。就我而言,我有:
  • 从我的网站设计中:
    • 内容类型,文档库和导航链接
    • 我的申请“COB purple” modern theme
  • 从我的PnP模板中:
    • 具有特定区域中特定Web部件的自定义现代主页
    • 应用于网站的区域设置
    • 另一个自定义文档库,很好
    • 行李袋入口
    • 请求访问权限设置已应用
It’看起来有点令人眼花water乱,但是’非常适合测试:)

概要

将PnP模板与SharePoint网站设计集成在一起的过程很少,但是它带来的强大功能是能够为Microsoft Teams和标准SharePoint模板化两个网站,这是一项重要技术。重要的是,使用PnP意味着您可以用站点设计当前无法实现的方式配置站点。希望本指南对理解机制有所帮助。如前所述,此处使用的所有文件都可以从以下位置下载:

//github.com/chrisobriensp/SiteDesignsAndPnPTemplating

使用C#Azure函数的SharePoint网站设计和PnP模板的端到端指南-第1部分

我认为一种模式将在2019年及以后使用,它将使用站点设计和PnP模板为SharePoint网站或Microsoft团队创建自定义模板。它’我和许多其他人已经以某种方式涵盖了这个主题,但目前大多数示例(包括 官方Microsoft文档)显示在Azure函数中使用PowerShell–但自从发布Azure Functions V2以来,这现在感觉很奇怪,并且不支持PowerShell。您可能知道,只有“experimental”在v1中,微软是否会解决他们的阻止问题还有待观察’引用(与V2函数绑定和PowerShell语言有关)。所以在这个迷你系列中’逐步介绍了使用C#编写的Azure函数实现的外观:

  1. Part 1 - Azure 队列, app 注册, Flow, Site Design and Site Script [this article]
  2. Part 2 - the Azure Function, Key Vault, enabling Managed Service 身分识别, and the PnP template

注意:我要引用的所有文件和代码都可以从此Github存储库中下载: //github.com/chrisobriensp/SiteDesignsAndPnPTemplating

食谱

总体而言,解决方案元素为:
  • SharePoint网站设计(和相应的网站脚本)
  • 将项目添加到Azure队列的流
  • A SharePoint app 注册 which allows the code to authenticate to SharePoint and modify the site
  • An Azure Function (queue-triggered) which authenticates to SharePoint (using the app 注册) and applies a PnP template to the site
此序列的简化表示可能是:

实施

阶段1– Azure things and SharePoint app 注册

我们需要先设置一些先决条件– the Azure 功能应用, 队列 and the SharePoint app 注册. I recommend creating these first as you’将需要这些东西的引用以用于后续步骤(例如,您的Flow需要队列的详细信息)。
所以让’s start there..
Creating the 队列 in Azure
  1. 为此,请导航到Azure门户,然后进入一个合适的存储帐户。如果你不这样做’已经有一个,只需创建一个(它’是一个用于存储Azure存储内容的容器,例如队列,表和BLOB)。
  2. 到达那里后,进入“Queues”区域并创建一个新区域:
        
        
  3. 此时,还要抓住存储密钥。进入一般存储帐户的区域(而不是我们刚刚创建的特定队列),然后进入“Access keys” area:


您’ll need both the 队列 name and access key later when we come to configure the flow, so keep these details somewhere handy but secure. 您r Flow will need to know them so it 能够 put a message on the 队列 :)
Creating the Azure 功能应用
我赢了’我不会详细介绍这一步骤’ve覆盖了其他地方(例如 创建和调试Azure函数的3种方法) –但从根本上讲,我们希望预先创建功能应用程序以在Azure中保留URL。我们不’在此阶段不必执行任何其他操作。但它’尽早执行此操作是个好主意,因为在其中一个步骤(例如注册SharePoint应用程序)中指定URL只会发现其他人已经采用了该URL,并且您需要重新做很多操作,这很烦人。配置。

当然,在Azure门户中创建功能应用程序可能是最简单的方法。我倾向于只点击大“Create”按钮并搜索“function app”:



请点击the “Create” button when you’ve found the item.

然后,您将到达可以提供详细信息的地方。重要的是:
  • 使用对您有意义的网址’re doing
  • 确保你’关于消费计划
  • Associate the 功能应用 with a storage account related to this solution
例如:

您’我需要决定你是否’为此材料重新创建一个新的资源组,或者是否适合您已有的资源组。同样,这只是标准的Azure应用服务内容,并且有大量文档和文章可根据需要帮助做出这些决定。

请点击“Create” when you’重新准备。确保功能应用成功创建,并记下您使用的URL–您可以通过列出所需的Azure中的应用程序服务来找回它。

Remember! 您r Function App should use Azure Functions V1 for now!
从2019年初开始,您需要暂时将Function App切换为使用功能运行时的V1(由于SharePoint CSOM和PnP的.NET依赖问题)。您需要先执行此操作,然后应用程序中才会存在任何实际功能。要进行切换,请进入“功能”应用设置,然后找到"Runtime version"设置。更改为"v1"并保存配置。







Creating the SharePoint app 注册
为此,我们使用SharePoint’的AppRegNew.aspx页面以注册我们的应用程序。请记住,这种身份验证方法会产生只能用于SharePoint的令牌(与Graph或Office 365的其他区域相对),但是’在模板SharePoint网站时我们需要的一切–即使恰好是属于Microsoft团队的网站。
  1. 导航到租户根网站集中的AppRegNew.aspx页面– so //YOUR_TENANT_HERE.sharepoint.com/_layouts/15/appregnew.aspx
  2. 填写应用程序的详细信息:
    1. 客户ID和客户机密可以是“Generate” button.
    2. 标题应该是你的东西’将识别为属于该解决方案,例如“网站设计配置” 要么 similar.
    3. 应用程序域和重定向URI应该反映您先前为功能应用程序使用的URL–前者具有领域,后者具有“//” 在 the beginning:
    4. 确保你 see the 确认 message –执行此操作时,请确保以下详细信息的安全:

认证风格
SharePoint加载项身份验证的替代方法是使用 AAD app 注册 and AAD auth。但是,对于仅应用程序身份验证,这种方法会涉及更多,因为它要求您创建和上传证书(可能是自签名的)并选择适当的AAD范围等。如果您的代码仅需要与SharePoint对话(例如,应用网站模板) ),而不是通过Graph与其他Office 365服务进行通信,则SharePoint加载项身份验证更加简单。请理解,如果您还想配置Microsoft Team或执行其他操作,则可能需要使用其他方法。
授予该应用的管理员同意
无论如何,假设我们坚持使用SharePoint应用程序身份验证,那么下一步就是信任该应用程序,以便它可以适当地访问您的租户:
  1. http:// _[yourtenant]-admin.sharepoint.com/_layouts/appinv.aspx (notice the -admin in the URL).
  2. 在里面 应用程式编号 字段,粘贴 客户编号 复制的内容,然后选择 抬头.
  3. 在里面 权限请求XML 字段,粘贴以下XML:

    <AppPermissionRequests AllowAppOnlyPolicy="true" >
       <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
    </AppPermissionRequests>


  4. 请点击创造:


  5. 要确认您要信任此应用,请选择 相信它:

We’现在已完成前提条件– so we’为Azure功能的网站设计,流程和代码做好准备。
Flow本身非常简单。所有你需要的是:
  • HTTP触发器
  • A “put a message on a 队列” action
这些步骤是:
  1. 转到Office 365中的Flow门户,然后在“My Flows" are click New > 创造 from blank:
  2. 添加一个“收到HTTP请求时”触发。为此,请搜索“http”使用搜索框:

  3. 找出“收到HTTP请求时”触发并选择它以将其添加到流中:

  4. 输入以下内容作为请求正文:

  5. 请点击“New step”, and type “queue”进入搜索框。找到并选择“Azure s列” item:

  6. 从那里选择“Put a message on a 队列” item:
  7. 假设你不 ’如果您已经定义了到Azure存储帐户的连接,请单击省略号(…)在流程中的操作上,找到“Add new connection” item:
  8. 在显示的框中输入存储帐户名称的详细信息并输入密钥(我们’请在一秒钟内选择该存储帐户中的实际队列)。请注意,连接名称可以是任何有意义的名称–但是连接本身是到整个存储帐户的,所以它’最好在名称中包含以下内容:
  9. 请点击“Create”.
  10. 现在,“流”操作应让您选择特定的队列,以及要放入的详细信息。 选择 the 队列 you created from the dropdown,对于"Message” value, select “webUrl”通过HTTP请求操作:
  11. 您 should end up looking something like this:
  12. 请点击in the Flow name near the top left of the screen, and rename your Flow to something sensible:
  13. 最后,点击“Save” to save the Flow:
获取流程的URL
您’需要将Flow的URL放入站点脚本中。要获取它,请按照下列步骤操作:
  1. 返回以编辑您的流程。
  2. 编辑“收到HTTP请求时”活动,并获取HTTP POST URL’s specified (there’s a ‘copy to clipboard’右边的按钮):

  3. 将网址存储在安全的地方,以备下一步使用。
网站设计和网站脚本
当你’我会记得,网站设计实际上是“registration”由一个或多个站点脚本(应在站点中提供的内容的JSON定义)组成的一组。因此,如果需要,您可以在许多站点设计中有效地共享站点脚本。这里’一个示例站点脚本,其中:
  • 应用名为的主题‘COB purple’ which I’之前在我的租户中定义的– see http://aka.ms/spsitetheming 有关现代SharePoint主题的更多详细信息
  • 使用它来呼叫我的流程’s URL – I’编辑了网站脚本,以粘贴到上一步中的“流URL”中
  • 设置几个自定义列表(一个带有一个自定义列),并将它们添加到网站导航中
  • 在某些列上配置JSON列格式

以便’s a site script. 您’我将需要使用如下所示的某些PowerShell注册网站脚本和网站设计。

第1步–注册站点脚本:


您'll get an output something like this:

Id          : be7c02a8-9134-4961-921a-cffc4772e97c
Title       : COB project site script
Description :
Content     :
Version     : 0
  

复制返回的ID,以备下一步使用。注册网站设计时,我们需要指向一个或多个包含配置步骤的网站脚本-因此,将其粘贴到您需要的下一部分PowerShell中,如下所示:


您'll now get an output something like this:

Id                  : ef49c695-b5e3-49ef-afba-ef053ca61414
Title               : COB project site
WebTemplate         : 64
SiteScriptIds       : {be7c02a8-9134-4961-921a-cffc4772e97c}
Description         : 创造s a COB project site with a theme applied
PreviewImageUrl     :
PreviewImageAltText :
IsDefault           : False
Version             : 1
  

Success! 您r site design and site script have now been registered, and it's hooked up to the Flow. However, we're not done yet - we still need our C# Azure Function which will actually do the work of applying the PnP template :) We'll do that in the next post..

Part 2 - the Azure Function, Key Vault, enabling Managed Service 身分识别, and the PnP template

2019年1月2日,星期三

PowerApps–在您的应用中实现离线支持的示例公式

在PowerApp中实现离线支持’一定是最简单的事情。当前,没有任何魔术设置可以启用此功能(不幸的是)。相反,您必须将所需的行为写入公式中– but it isn’也是最复杂的事情。我在上一篇文章中链接了一些示例公式,但是今天我想更详细地介绍它们,并逐步了解我选择的脱机行为和相应的公式。

我在SharePoint Conference 2019上谈论这一点!
如果您想了解更多有关此的信息,我将在SPC 2019上就该主题举行会议。会议将于5月21-23日在拉斯维加斯举行-请参阅 //sharepointna.com 更多细节。并在使用时使用代码“ OBRIEN”! ;)

上行空间 您自己必须实施离线支持的原因是’完全控制用户体验。我选择在应用程序中实现几个简单的屏幕,以显示具有以下行为的适当消息(请在此处使用快速又脏的Visio):

PowerAppsoffline process

以便’的行为。您可能还决定让用户清楚地知道他们当前是否有连接– I added a “connection bar”转到我的应用程序的主屏幕,这实际上只是一个Label控件,其文本和填充颜色设置适当:

PowerAppsonline - Copy 2 PowerAppsoffline - Copy

公式很简单:

文本:

填:

如果用户在提交表单时处于离线状态,则会被带到“pending”屏幕上显示以下消息:

 Generic - PowerApp - 待定 screen

..but if the user is online when they submit, OR he/she returns to the app later after initially being offline, then the record is submitted and they are navigated to the 确认 screen:

Generic - PowerApp - 确认 screen

当你 能够 see from the messages, we’重新告知用户,如果他们初次提交请求时必须返回应用程序’没有联系。 PowerApps目前无法与数据源对话,但是我们 能够 在本地存储数据,直到重新建立连接。

如果你没有’如果不想将用户重定向到应用中完全不同的屏幕,则可以执行其他操作,例如使用 通知() 功能:

SNAGHTML3995e4c

但就我而言,我觉得顶部的通知栏很窄’不够明显-但是’s up to you.

公式

这是我用于将数据本地保存/导航到适当屏幕的行为的公式:

公式1:
  • 哪里: 提交我的表格按钮
  • 描述: 如果存在连接,则将记录提交到SharePoint,否则将其本地保存到设备–这是通过创建具有以下内容的本地集合来完成的 ClearCollect() 然后打电话 保存Data().然后将用户带到"pending" screen.
公式2:
  • 哪里: timer control added to 待定 screen
  • 描述: 查看是否存在名为“ LocalRecord”的已保存集合,如果存在,则将该记录提交到SharePoint。然后清除集合,然后将用户带到"confirmation" screen.

使用这种方法时,我决定为两个"pending" screen and the home screen of my app - this seems to work well in terms of ensuring the data is submitted as soon as the user comes back to the app with a connection, regardless of whether they resume where they left off (usually the 待定 screen), 要么 the app has to restart (perhaps because the device was restarted). 重要的是,*一旦*重新建立连接后,用户有必要重新进入应用程序-使用PowerApps,不可能"fire and forget"不幸的是,该请求是对数据源的请求(即,当设备恢复在线状态而没有返回应用程序时,该记录会自动提交)。 我假设只有某些具有低级OS集成的应用程序可以在后台运行时执行这样的任务,而PowerApps和Nintex移动应用程序(例如)在这方面是相同的。

概要

PowerApps中的离线支持是’轻按一下开关,但是一旦知道了配方’不太难。本质上是’有关检测设备是否已连接以及是否未使用的问题 收藏() 要么 ClearCollect() 创建本地集合,然后调用 保存Data() 确保将其正确保存到设备中。 PowerApps计时器控件可能是有用的方法“auto-submitting”数据,尽管您同样可以选择向用户提供一个按钮来明确单击–无论哪种情况,您都可以从本地集合中获取数据,然后使用类似以下的方法将其提交到数据源: 补丁() 添加数据库记录或SharePoint列表项,或者 更新() 更新。应用程式建设愉快!