当我们开发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 REST中的授权的研究的更多相关文章

  1. SharePoint 2010中重置windows 活动目录(AD)域用户密码的WebPart(免费下载)

    由于SharePoint 2013推出不久,并非所有的企业都会升级到SharePoint 2013的,毕竟升级不是打打补丁这么简单,更多的企业还是使用Sharepoint 2010版本的,因此本人自行 ...

  2. SharePoint 2013中以其他用户身份登录的WebPart(免费下载)

    在SharePoint 2013中微软并没有提供在SharePoint 2010中以其他用户身份登录的菜单,这对一般用户影响不大,但对于系统管理员或测试人员或特定人员(如在OA系统中的文员或秘书,常常 ...

  3. SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)

    前段时间工作很忙,好久没更新博客了,趁国庆休假期间,整理了两个之前积累很实用的企业集成组件,并在真正的大型项目中经受住了考验:.Net版SAP RFC适配器组件和SharePoint 2013修改AD ...

  4. 在 SharePoint 2010 中访问数据

    转:http://blog.banysky.net/?p=81001 数据访问的关键方法有哪些? | 使用查询类 | 使用 SPQuery | 使用 SPSiteDataQuery | 使用 LINQ ...

  5. 在中间层 .NET 应用程序中通过授权管理器使用基于角色的安全

    基于角色的安全是从 Windows NT 的第一个版本开始在 Windows 平台上发展而来的.使用角色,操作系统可以通过检查称为 BUILTIN\Administrators 的组的安全上下文做出一 ...

  6. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  7. 如何生成报告来枚举出整个sharepoint环境中的每个页面所使用的所有webpart

    背景 我的公司的SharePoint环境中购买了大量的第三方webpart,比如Quick Apps, Telerik RadEditor, Nintex Workflow等等..这样做的好处就是成本 ...

  8. 在SharePoint 2010中,如何找回丢失的服务账号(Service Account)密码

    背景信息: 通常在SharePoint环境中我们会使用很多的服务账号来运行各种不同的服务,尤其在企业环境中,由于权限管理条例严格,这些服务账号更是只能多不能少.面对如此多的服务账号,各个企业都会有自己 ...

  9. SharePoint 2013 中的 PowerPoint Automation Services

    简介                许多大型和小型企业都将其 Microsoft SharePoint Server 库用作 Microsoft PowerPoint 演示文稿的存储库.所有这些企业在 ...

随机推荐

  1. 【软件使用】TortoiseSVN版本管理软件使用简单说明

    TortoiseSVN版本管理软件使用简单说明 很多时候在写一个小的项目不想使用github等工具,只想简单在本地搭建一个版本管理器.那么TortoiseSVN就非常适合. 第一步:下载Tortois ...

  2. Spring事务的传播特性和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  3. Mybatis 学习-2

    创建基于session的util类,在线程中共享SqlSession package cn.smartapp.blogs.pojo; import java.io.Serializable; impo ...

  4. discuz核心函数库function_core的函数注释

    /** * 系统错误处理 * @param <type> $message 错误信息 * @param <type> $show 是否显示信息 * @param <typ ...

  5. 张艾迪(创始人):拥抱单身与自由的Eidyzhang

    拥抱单身与自由(Single+Freedom) 拥抱伟大的梦想与理想.年轻一代的张扬与自信 拥抱AOOOiA.Global.224C的一切是我对这个世界的态度 +AOOOiA.Global.224C创 ...

  6. CSS 层叠及样式表来源

    Web标准化运动的口号——分离.分离.分离. 在2003年的 SXSW 会议中, Steve Champeon 和 Nick Finck 做了一个名为“面向未来的全方位 Web 设计”的演讲,揭示了这 ...

  7. 修改Window的hosts文件提示“该文件被其他程序占用”解决方案

    1.打开C:\Windows\System32\drivers\etc中的hosts 2.右键——>属性——>安全 3.在修改保存就可以了

  8. [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架

    第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...

  9. 数据库索引<二> 补充前篇 (上一篇抽风了,这个补上)

    在前一个创建索引中已经大概说了三部分的影响,基本应该注意哪一些.写完上一篇后我感觉有很多地方没有写清楚,所以这篇就是更深入一些的理解索引到底是怎么和数据表关联,怎么快速查询的. 先看一下下面的图,图是 ...

  10. for循环语句以及迭代法和穷举法

    循环语句: 四要素:初始条件,循环条件,状态改变,循环体 for(初始条件;循环条件;状态改变){ //循环体} 案例1:打印等腰直角三角形和菱形 左上三角 static void Main(stri ...