关于SharePoint REST中的授权的研究

原创 2015年04月14日 09:58:37
博客地址:http://blog.csdn.net/FoxDave
当我们开发SharePoint APP需要调用REST服务时,可以使用OAuth完成授权,也可以使用跨域库。以下是微软专家的一段注解。
如果是从无法以独占方式使用客户端代码(HTML 和 JavaScript)的远程托管应用程序调用 SharePoint,且 SharePoint 与应用程序之间没有防火墙阻隔,则可使用 OAuth 2.0 令牌(使用 Microsoft 访问控制服务 (ACS) 作为安全令牌服务器)。
如果客户端代码和登录到 SharePoint 的用户的权限足够,则 JavaScript 跨域库 (bit.ly/12kFwSP) 将是一个很好的 OAuth 替代品。 另外,当进程调用需要穿过防火墙时,跨域库也是替代 OAuth 的一个好选择。 MSDN 库文章“SharePoint 2013 数据访问选项”(bit.ly/WGvt9L) 详细介绍了这些选项。
但是这些主要都是针对SharePoint App来说的,当我们在我们自己的应用(如第三方网站、移动设备等)中要通过REST获取sharepoint的内容时,要如何做呢?
笔者做了以下一些研究,但是没有得出最终解决方案,前一阵请教过Jason Huang,后来也没有音信了。欢迎大牛能进行指点,也欢迎大家多多讨论。
我先描述一下大致的场景:远程SharePoint网站,采用NTLM协议的认证。我要做的就是通过调用REST服务来获取数据。
本文以命令行程序作为示例,访问SharePoint的内容。

一. 采用网络请求(WebRequest)的方式
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://ap.2013.trial.nintex.com/_api/web/");
            request.Accept = "application/json;odata=verbose";
            NetworkCredential myCredential = new NetworkCredential("Justin.Liu1", "3QF0\"gn", "EXT");
            request.Credentials = myCredential;
            WebResponse response = request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string content = sr.ReadToEnd();
这个方式获得了我需要的数据,抓包可以看到网络请求的过程如下:

基本的流程大致如下:
先去敲门,远程SharePoint回应“我在”;然后用提供的凭据去进行验证,验证通过后返回认证通过的编码串;通过这个编码串再去请求需要的数据,远程SharePoint认证通过会返回请求的数据。

二. 采用客户端对象模型CSOM的方式
NetworkCredential myCredential = new NetworkCredential("Justin.Liu1", "3QF0\"gn", "EXT");
ClientContext ctx = new ClientContext("https://ap.2013.trial.nintex.com/");
            ctx.Credentials = myCredential;
            Web web = ctx.Web;
            ctx.Load(web);
            ctx.ExecuteQuery();
            string title = web.Title;
这种方式也获得了我需要的数据,来看一下抓包得到的过程:
从中我们可以看到,CSOM实际上是封装了SharePoint的WebService。

三. 采用调用SharePoint WebService的方式
//Site URL: https://ap.2013.trial.nintex.com
            //Username: EXT\Justin.Liu1
            //Password: 3QF0"gn
            var soapEnv = string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
                    <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
                      <soap:Body>
                        <Login xmlns=""http://schemas.microsoft.com/sharepoint/soap/"">
                          <username>{0}</username>
                          <password>{1}</password>
                        </Login>
                      </soap:Body>
                    </soap:Envelope>","EXT\\Justin.Liu1","3QF0\"gn");
            byte[] data = Encoding.UTF8.GetBytes(soapEnv);
            HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create("https://ap.2013.trial.nintex.com/_vti_bin/Authentication.asmx");
            loginRequest.Headers["SOAPAction"] = "http://schemas.microsoft.com/sharepoint/soap/Login";
            loginRequest.Method = "POST";
            loginRequest.ContentType = "text/xml; charset=utf-8";
            loginRequest.ContentLength = data.Length;
            Stream requestStream = loginRequest.GetRequestStream();
            requestStream.Write(data, 0, data.Length);
            requestStream.Close();
            WebResponse loginResponse = loginRequest.GetResponse();
            Stream loginStream = loginResponse.GetResponseStream();
            StreamReader lsr = new StreamReader(loginStream);
            string loginContent = lsr.ReadToEnd();
            requestStream.Close();
该方式并没有成功,报出401未授权的错误:
 
我为什么尝试第三种方式,因为在移动设备中应该是无法应用前两种方式的。
以上便是之前研究的总结,由于有其他事情暂且搁置在此并分享出来,希望对朋友们能起到抛砖引玉的作用,也欢迎共同探讨解决方案。
版权声明:本文为博主原创文章,未经博主允许不得转载。

sharepoint 2016 学习系列篇(10)-给子网站单独授权用户访问权限

创建完子网站,以及我们前面提到的关于网站用户权限的介绍,在sharepoint网站中,我们发现,创建子网站(sub site)的时候,它会默认的继承主网站权限,也就是说,创建好的子网站(sub sit...
  • cxx2325938
  • cxx2325938
  • 2015年09月07日 09:37
  • 2062

对你的 REST API 进行保护的正确办法

计好一个漂亮的 REST + JSON API 之后,如何对你的 API 进行保护?在 Stormpath,我们花了 18 个月来寻找最佳实践,将其一一实践于 Stormpath API 中并分析其效...
  • defonds
  • defonds
  • 2015年08月17日 20:37
  • 7421

sharepoint rest userprofile

  • 2015年10月26日 10:19
  • 303B
  • 下载

sharepoint rest search api

  • 2015年01月28日 17:26
  • 4.4MB
  • 下载

SharePoint—用REST方式访问列表

REST的定义与作用                                                                                          ...
  • dyllove98
  • dyllove98
  • 2013年06月22日 22:02
  • 3444

SharePoint 2013 REST 服务使用简介

1、创建测试使用列表”REST Demo”,插入一些测试数据,如下图:   2、添加内容编辑器,并且添加脚本引用以及HTML代码,如下图:   Result的Div为显示结果使用,input标...
  • gonghong2525
  • gonghong2525
  • 2014年12月19日 18:11
  • 387

SharePoint REST API - 概述

博客地址:http://blog.csdn.net/FoxDaveSharePoint REST API不同于传统的Server Object Model和Client Object Model,是一...
  • FoxDave
  • FoxDave
  • 2017年05月01日 11:46
  • 1320

SharePoint 2013 REST Service how to Retrive The List Items

In SharePoint 2013, we can query the list by it owner service, then dynamic load the info of the lis...
  • Tristan_Dong
  • Tristan_Dong
  • 2013年11月14日 18:14
  • 1885

SharePoint—用REST方式访问列表 Filter

REST的定义与作用                                                                                          ...
  • lingpaoershiyishiji
  • lingpaoershiyishiji
  • 2015年08月28日 10:17
  • 785

SharePoint 2003 用REST方式访问列表 Filter等高级操作。

首先为了方便在chrome 里调试Rest 结果。这里先介绍如URL https://xxx.xxx.com.cn/itc/_api/web/GetFolderByServerRelativeUrl(...
  • jason_dct
  • jason_dct
  • 2016年05月30日 11:44
  • 989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于SharePoint REST中的授权的研究
举报原因:
原因补充:

(最多只允许输入30个字)