標籤:sharepoint sharepoint 2013 rest
部落格地址:http://blog.csdn.net/FoxDave當我們開發SharePoint APP需要調用REST服務時,可以使用OAuth完成授權,也可以使用跨網域程式庫。以下是微軟專家的一段註解。如果是從無法以獨佔方式使用用戶端代碼(HTML 和 JavaScript)的遠程託管應用程式調用 SharePoint,且 SharePoint 與應用程式之間沒有防火牆阻隔,則可使用 OAuth 2.0 令牌(使用 Microsoft 存取控制服務 (ACS) 作為Security Token Service器)。如果用戶端代碼和登入到 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中的授權的研究