关于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 2013 修改验证方式(Kerberos and NTLM) 和如何修改 website collection Host Header

SharePoint 2013 修改验证方式(Kerberos and NTLM)  如果这些设置不对,将会导致的 Sharepoint 系统反复登录不成功。 第一步,Sharepoint  Cent...

sharepoint2013 restful api

 资 料:http://technet.microsoft.com/zh-cn/jj163227(v=office.15)

10分钟精通SharePoint-OAuth

简介 OAuth是Open Authorization,其实是一个和授权相关的协议,为用户资源授权提供开放、安全而且又简易的标准。而且OAuth从安全角度来说是相对安全的,不触及用户名和密码。其...
  • ITBoxes
  • ITBoxes
  • 2017年03月11日 12:23
  • 237

sharepoint rest userprofile

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

sharepoint rest search api

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

SharePoint REST API - 基本操作(一)

博客地址:http://blog.csdn.net/FoxDave 你可以使用SharePoint提供的REST接口执行基本的增删查改操作。REST接口暴露了所有的SharePoint客户端API中可...
  • FoxDave
  • FoxDave
  • 2017年08月04日 16:55
  • 710

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

首先为了方便在chrome 里调试Rest 结果。这里先介绍如URL https://xxx.xxx.com.cn/itc/_api/web/GetFolderByServerRelativeUrl(...

SharePoint REST API - 概述

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

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...

SharePoint—用REST方式访问列表

REST的定义与作用                                                                                          ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于SharePoint REST中的授权的研究
举报原因:
原因补充:

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