Извлечение данных REST с помощью NTLM с сайта с двойной проверкой подлинности в SharePoint 2010
Исходная статья опубликована в четверг, 27 октября 2011 г.
Название этой публикации выглядит несколько сложнее, чем финальное решение. Фактически, речь идет о сочетании методов, которые я рассматривал в двух предыдущих публикациях: https://blogs.technet.com/b/speschka/archive/2010/09/25/retrieving-rest-data-in-a-claims-based-auth-site-in-sharepoint-2010.aspx и https://blogs.technet.com/b/speschka/archive/2011/04/01/retrieving-data-from-a-multi-auth-site-using-the-client-om-and-web-services-in-sharepoint-2010.aspx. Краткая версия этого сценария такова — кто-то захотел, например, проверить связь с сайтом SharePoint, на котором используется проверка подлинности SAML. Раньше они работали только с сайтами, на которых использовалась проверка подлинности Windows, и когда они попытались применить прежние средства для сайта, поддерживающего разные типы проверки подлинности — SAML и Windows — эти средства перестали работать.
Проверка связи — это просто выполнение запроса к сайту, в результате которого данные запроса должны вернуться отправителю. Если вместо этого возвращается код какой-либо ошибки, то можно начинать с ней разбираться. Я решил, что самый простой способ — это вызвать listdata.svc, которая является конечной точкой REST для сайта. Она имеется всегда, и настроить ее с целью использования NTLM на сайте с несколькими типами проверки подлинности оказалось довольно просто. Идея этого метода — выполнить запрос HttpWebRequest и добавить заголовок, описанный во второй ссылке выше, который задаст принудительное использование NTLM. В результате получается весьма очевидный фрагмент кода, ср:
string endpoint = UrlTxt.Text + "/_vti_bin/listdata.svc";
//запрос к интерфейсу REST на предмет данных
HttpWebRequest webRqst = (HttpWebRequest)WebRequest.Create(endpoint);
webRqst.UseDefaultCredentials = true;
webRqst.Method = "GET";
webRqst.Accept = "*/*";
webRqst.KeepAlive = true;
webRqst.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
//чтение ответа
HttpWebResponse webResp = webRqst.GetResponse() as HttpWebResponse;
//запрос и получение ответа
StreamReader theData = new StreamReader(webResp.GetResponseStream(), true);
string payload = theData.ReadToEnd();
theData.Close();
webResp.Close();
ResultsTxt.Text = payload;
Как видно, я просто создал запрос, задал несколько свойств и затем добавил заголовок, который предписывает SharePoint использовать проверку подлинности Windows. Затем я просто выполняю запрос и все. Это довольно простой проект, но я присоединил полное решение к этой публикации на случай, если оно окажется полезным.
Это локализованная запись блога. Исходная статься находится по адресу: Retrieving REST Data Using NTLM From a Dual Auth Site in SharePoint 2010