在这个示例里我们将详细介绍 TokenHelper 类, 我们将看到它是怎么简单地从远程web站点访问SharePoint的。我们还将取到它的一些值。这将帮助我们理解连接是怎么被构造的,同时也方便我们的以一的调试。我们将创建一个简单的 auto-hosted app,用TokenHelper类从相关的SharePoint服务器读取数据,并显示在页面上。我们还将取出一些token的值以方便看到它们的内容。

1. 打开Visual Studio 2012.
2. 创建一个新的  C# SharePoint app 项目:RemoteWebApp。
3. 选择 Autohosted (它是缺省项).
这将生成二个projects. 第一个是 SharePoint app web, 第二个是远程web站点。当debug时,远程的web app 将运行在本地的IIS Express上。当通过
remote web site. When debugging, the remote web app will run on a local copy of IIS Express. When deployed
Office Store 或一个 App 目录,远程的web将被发布到 Azure 云。

4. 按F5运行app

这个页面将查询host web 站咪的title,并显示在页面上。它只用了几行就做到了,因为它使用了TokenHelper 这个类。我们下面将详细介绍它的使用。

5. 停止调试
6. 打开Default.aspx.cs
7. 注释Page_Load() 里已有的代码
8. 加入下面的引用:

using Microsoft.IdentityModel.S2S.Protocols.OAuth2;
using Microsoft.SharePoint.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Web.UI;
using System.Web.UI.WebControls;

9. 加入下面的代码到Page_Load() :

// Get app info from web.configstring clientID = string.IsNullOrEmpty(WebConfigurationManager.AppSettings.Get("ClientId"))? WebConfigurationManager.AppSettings.Get("HostedAppName"): WebConfigurationManager.AppSettings.Get("ClientId");string clientSecret = string.IsNullOrEmpty(WebConfigurationManager.AppSettings.Get("ClientSecret"))? WebConfigurationManager.AppSettings.Get("HostedAppSigningKey"): WebConfigurationManager.AppSettings.Get("ClientSecret");

client ID 和 secret 是从远程web的配置文件读取到的,ID 指向 app, secret 被用作获取 access tokens。

10. 加入下面的代码到Page_Load() :

// Get values from Page.Requeststring reqAuthority = Request.Url.Authority;string hostWeb = Page.Request["SPHostUrl"];string hostWebAuthority = (new Uri(hostWeb)).Authority;

11. 加入下面的代码到Page_Load() :

// Get Context Tokenstring contextTokenStr = TokenHelper.GetContextTokenFromRequest(Request);SharePointContextToken contextToken =TokenHelper.ReadAndValidateContextToken(contextTokenStr, reqAuthority);// Read data from the Context Tokenstring targetPrincipalName = contextToken.TargetPrincipalName;string cacheKey = contextToken.CacheKey;string refreshTokenStr = contextToken.RefreshToken;string realm = contextToken.Realm;

SharePoint 还将传递encode  context token, ReadAndValidateContextToken() 方法把它转换成一个 SharePointContextToken 对象,这样就更容易访问它的内容, 验证这个token指的是验证它的地址是来自这个app。剩下的代码就是从token里取出一些值.

12. 把这下面这个方法加到 Default 页面.

private static string GetFormattedPrincipal(string principalName, string hostName, string realm){if (!String.IsNullOrEmpty(hostName)){return String.Format(CultureInfo.InvariantCulture, "{0}/{1}@{2}", principalName, hostName, realm);}else{return String.Format(CultureInfo.InvariantCulture, "{0}@{1}", principalName, realm);}}

13. 加入下面的代码到Page_Load() :

// Create principal and client stringsstring targetPrincipal = GetFormattedPrincipal(targetPrincipalName, hostWebAuthority, realm);string appPrincipal = GetFormattedPrincipal(clientID, null, realm);

app principal 哪个app正在做请求; target principal 确认哪个application, host 和 realm 将收到请求。

14. 加入下面的代码到Page_Load() :

// Request an access token from ACSstring stsUrl = TokenHelper.AcsMetadataParser.GetStsUrl(realm);OAuth2AccessTokenRequest oauth2Request =OAuth2MessageFactory.CreateAccessTokenRequestWithRefreshToken(appPrincipal, clientSecret, refreshTokenStr, targetPrincipal);OAuth2S2SClient client = new OAuth2S2SClient();OAuth2AccessTokenResponse oauth2Response = client.Issue(stsUrl, oauth2Request) as OAuth2AccessTokenResponse;string accessTokenStr = oauth2Response.AccessToken;

这是连接回到host web的关键, 这段代码请求 OAuth access token 并把它送到 Access Control Service (ACS). ACS发布了 access token 并且把它返回到远程的。这里能用同步调用,因为在服务端而不是在sharepoint。

15. 加入下面的代码到Page_Load() :

// Build the CSOM context with the access tokenClientContext clientContext = TokenHelper.GetClientContextWithAccessToken(hostWeb, accessTokenStr);clientContext.Load(clientContext.Web, web => web.Title);clientContext.ExecuteQuery();

这里我们用access token创建一个CSOM client context 去请求 sharepoint . 我们这里用同步的ExecuteQuery(),因为这是服务端的代码。

16. 加入下面的代码到Page_Load() 显示数据 :

// Dump values to the pageDataTable dt = new DataTable();dt.Columns.Add("Name");dt.Columns.Add("Value");dt.Rows.Add("QueryString", Request.QueryString);dt.Rows.Add("clientID", clientID);dt.Rows.Add("clientSecret", clientSecret);dt.Rows.Add("hostWeb", hostWeb);dt.Rows.Add("contextTokenStr", contextTokenStr);dt.Rows.Add("contextToken", contextToken);dt.Rows.Add("targetPrincipalName", targetPrincipalName);dt.Rows.Add("cacheKey", cacheKey);dt.Rows.Add("refreshTokenStr", refreshTokenStr);dt.Rows.Add("realm", realm);dt.Rows.Add("targetPrincipal", targetPrincipal);dt.Rows.Add("appPrincipal", appPrincipal);dt.Rows.Add("stsUrl", stsUrl);dt.Rows.Add("oauth2Request", oauth2Request);dt.Rows.Add("client", client);dt.Rows.Add("oauth2Response", oauth2Response);dt.Rows.Add("accessTokenStr", accessTokenStr);dt.Rows.Add("Host Web Title", clientContext.Web.Title);grd.DataSource = dt;grd.DataBind();

17. 打开Default.aspx 页面.
18. 加入下面的GridView :

<asp:GridView ID="grd" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="True" Width="100%"><AlternatingRowStyle BackColor="White" /><EditRowStyle BackColor="#2461BF" /><FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /><HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /><PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /><RowStyle BackColor="#EFF3FB" /><SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /><SortedAscendingCellStyle BackColor="#F5F7FB" /><SortedAscendingHeaderStyle BackColor="#6D95E1" /><SortedDescendingCellStyle BackColor="#E9EBEF" /><SortedDescendingHeaderStyle BackColor="#4870BE" /></asp:GridView>

19. 按 F5 运行APP.
这个app显示了远程站点的 default 页面,显示了这个站点的token的值。这些值让我们更方便地调试我们的app。

SharePoint 2013 APP 开发示例 系列

SharePoint 2013 APP 开发示例 (三)使用远程的web资源相关推荐

  1. SharePoint 2013 APP 开发示例 系列

    SharePoint 2013 APP 安全: SharePoint 2013 APP 开发示例 (一)List 读写 SharePoint 2013 APP 开发示例 (二)获取用户信息 Share ...

  2. SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)

    上个示例(SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API))是基于JavaScript,运行在web browser内去访问REST AP ...

  3. SharePoint 2013 APP 开发示例 (二)获取用户信息

    这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的  SharePoint 2013 app: UserProfileTest. 3. 选 ...

  4. SharePoint 2013 App Remote Event Receivers

    当我们在使用App的时候,就会发现一些问题,比如那些网站部署.更新或者卸载了,我们很关心我们的App是否有人用,这就需要远程事件接收器了. 1.在我们的测试App的解决方案上选中鼠标,按F4弹出属性, ...

  5. SharePoint 2013常用开发工具分享

    众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...

  6. SharePoint 2013 本地开发解决方案以及程调试

    SharePoint 2013 本地开发解决方案以及程调试 在SharePoint开发中,我们需要在部署有SharePoint环境的服务器中开发,这是一件让人很苦恼的事情,毕竟不能一个项目多人开发配备 ...

  7. SharePoint 2013 图文开发系列之自定义字段

    原文:SharePoint 2013 图文开发系列之自定义字段 SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应 ...

  8. SharePoint 2013 App Development读书笔记1

    传统的Farm部署方式有一些缺点,例如运行在SharePoint环境中的自定义代码会带来安全隐患.自定义代码很多时候要提升权限来做一些事情,虽然解决了权限不够的问题,但是有带来了权限过大的问题,这个问 ...

  9. Android App 开发的三种姿势 ~

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 现在市场上各式各样的App越来越多,其实设计一个App也没有那么难,这期就讲解一下安卓开 ...

最新文章

  1. 总结 | 2020年TOP 10计算机视觉论文:代码,解读,还有demo视频!
  2. PHP反射ReflectionClass、ReflectionMethod 入门教程
  3. 深入理解分布式技术 - 探究缓存穿透、缓存击穿、缓存雪崩解决方案
  4. 全球及中国教育信息化行业投资模式与发展建议咨询报告2022版
  5. 客户端相关知识学习(四)之H5页面如何嵌套到APP中
  6. java 画图板源代码_非常值得学习的java 绘图板源代码
  7. 工作250:uniapp--实战--flex布局--星级评分
  8. linux内核那些事之ZONE
  9. virtualbox 网络配置
  10. mysql数据库产生的背景_MySql路途之mysql背景
  11. 单一世界十万在线webgame的设计思路(五)-- 整体架构和总结
  12. 几张图来好好理解Spring的循环依赖
  13. html快闪软件制作,教你如何用PPT轻松完成快闪视频制作?
  14. 3.30华为笔试第三题
  15. python 2.7导入arcpy_导入 ArcPy
  16. 将vscode打造成无敌的IDE(5)打造shell IDE--三大神器
  17. Global Shutter(全局快门)与Rolling Shutter(卷帘快门)的区别与比较
  18. 柳传志退休:激荡三十五年
  19. 国赛培训——最优化智能算法——模拟退火
  20. 博思特POSITAL编码器OCD58-CA1212-B15V-H3P

热门文章

  1. 学习旧岛小程序 (4)封装api 请求
  2. java word转html 报错 org/apache/poi/xwpf/usermodel/IRunBody
  3. [总结]vue开发常见知识点及问题资料整理(持续更新)
  4. 电磁学讲义2:库仑定律
  5. Hive与Hbase结合使用
  6. [Spring MVC] - JSP + Freemarker视图解释器整合
  7. android.database.cursorindexoutofboundsexception错误解决 及获取某行某列信息
  8. java get post 区别详解_[Java教程]GET 与 POST 其实没有什么区别
  9. 函数不可访问_C++之访问控制与继承
  10. 【Matlab 控制】仿真多智体一致性分析,附代码