关于SharePoint REST中的授权的研究

简介: 博客地址:http://blog.csdn.net/FoxDave当我们开发SharePoint APP需要调用REST服务时,可以使用OAuth完成授权,也可以使用跨域库。
当我们开发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未授权的错误:
 
我为什么尝试第三种方式,因为在移动设备中应该是无法应用前两种方式的。
以上便是之前研究的总结,由于有其他事情暂且搁置在此并分享出来,希望对朋友们能起到抛砖引玉的作用,也欢迎共同探讨解决方案。
相关文章
|
6月前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
264 1
|
JSON 测试技术 API
评测最火的 11 款 REST API GUI
尽管 RESTful Web 服务具有可扩展性且易于维护,但是手动进行 API 测试操作复杂,因此我们需要选择一些好用的客户端来帮助我们测试 REST API。这里,码匠为大家罗列了 11 款最火的用于 REST API 测试的客户端工具。
4187 1
评测最火的 11 款 REST API  GUI
|
3月前
|
存储 JSON 机器人
【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)
【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)
|
3月前
|
API
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
|
3月前
|
API 数据安全/隐私保护 网络架构
【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization
【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization
|
6月前
|
开发框架 安全 JavaScript
解密IIS服务器API跨域问题的终极解决方案
解密IIS服务器API跨域问题的终极解决方案
309 0
|
Oracle 架构师 关系型数据库
【API架构】REST API 行业辩论:OData vs GraphQL vs ORDS
【API架构】REST API 行业辩论:OData vs GraphQL vs ORDS
|
SQL 安全 API
api漏洞系列-api漏洞综述
前言 这篇文章本该为在api漏洞系列的第一篇,但是当时感觉还不到时候,最近看了一些相关姿势(文末有福利),感觉可以写了,于是便有了这篇文章(主要是笔记),先声明一下,这篇文章没有涉及到具体的相关技术细节,主要是一篇综述性的文章,方便日后查阅与学习.
162 1
|
API 网络架构 Windows
IIS集中化管理与编程REST API
IIS集中化管理与编程REST API 目录 一、       简介 二、       安装 三、       IIS Administration配置文件 四、       Web UI管理界面 五、       IIS Administration API   一、简介 Microsoft IIS Administration 微软提供,管理IIS配置的REST API 和集中化IIS管理WEB UI。
2127 0