Создание настраиваемой страницы прокси для междоменной библиотеки в SharePoint
При создании надстроек SharePoint обычно необходимо объединять данные из различных источников. Тем не менее, из соображений безопасности существуют механизмы блокировки, которые препятствуют связи более чем с одним доменом одновременно.
Вы можете использовать междоменную библиотеку для доступа к данным в удаленной надстройке, если реализуете настраиваемую прокси-страницу, размещенную в инфраструктуре удаленной надстройки. Как разработчик вы отвечаете за реализацию настраиваемой прокси-страницы и пользовательской логики, например, за механизм проверки подлинности для удаленной надстройки. Используйте междоменную библиотеку с настраиваемой прокси-страницей, если необходимо, чтобы взаимодействие происходило на уровне клиента.
Необходимые условия для использования примеров в этой статье
Вам необходима среда разработки, описанная в статье Создание надстроек SharePoint, размещаемых у поставщика.
Ключевые понятия, с которыми необходимо ознакомиться перед использованием настраиваемой страницы прокси вместе с надстройками SharePoint
Ниже перечислены полезные статьи, в которых описано, как запрашивать данные для надстроек SharePoint из удаленного домена.
Название статьи | Описание |
---|---|
Надстройки SharePoint | Сведения о новой модели надстроек в SharePoint, с помощью которой можно создавать небольшие и удобные в использовании надстройки для пользователей. |
Безопасный доступ к данным и клиентские объектные модели для надстроек SharePoint | Узнайте о параметрах доступа к данным в Надстройки SharePoint. В этой статье представлена информация об альтернативах высокого уровня при работе с данными в надстройке. |
Хост-сайты, сайты надстроек и компоненты SharePoint в SharePoint | Узнайте, в чем разница между хост-сайтами и сайтами надстроек. Узнайте, какие компоненты SharePoint можно включать в надстройку для SharePoint, какие компоненты разворачиваются на хост-сайте, какие компоненты разворачиваются на сайте надстройки, и как выполняется развертывание сайта надстройки в изолированном домене. |
Междоменная безопасность на стороне клиента | Изучите междоменные угрозы и примеры использования, а также принципы безопасности для междоменных запросов, и оцените риски разработчиков, связанные с улучшением междоменного доступа из веб-приложений, которые запускаются в браузере. |
Пример кода. Доступ к удаленным данным с помощью настраиваемой прокси-страницы для междоменной библиотеки
Чтобы прочесть данные из удаленной службы, выполните указанные ниже действия.
Создайте проект надстройки для SharePoint.
Измените манифест надстройки, чтобы разрешить связь с удаленной надстройкой.
Создать настраиваемую прокси-страницу и страницу контента в веб-проекте.
Создать страницу, которая использует междоменную библиотеку в проекте Надстройка SharePoint.
Создание проекта надстройки SharePoint
Откройте Visual Studio от имени администратора. (Для этого щелкните правой кнопкой мыши значок Visual Studio в меню Пуск и выберите Запуск от имени администратора.)
Создайте надстройку SharePoint с размещением у поставщика, как описано в этой статье, и назовите ее ProxyPageApp.
Изменение файла манифеста надстройки
В обозревателе решений щелкните правой кнопкой мыши файл AppManifest.xml и выберите Просмотреть код.
Замените весь элемент AppPrincipal указанным ниже фрагментом.
<AppPrincipal> <Internal AllowedRemoteHostUrl="~remoteAppUrl"/> </AppPrincipal>
Примечание.
Атрибут AllowedRemoteHostUrl используется для указания удаленного домена. ~remoteAppUrl принимает значение URL-адреса удаленной надстройки. Дополнительные сведения о маркерах см. в статье Изучение структуры манифеста приложения и пакета надстройки SharePoint.
Создание настраиваемой страницы прокси
После создания решения Visual Studio щелкните правой кнопкой мыши проект веб-приложения (не проект надстройки SharePoint) и выберите Добавить>Новый элемент>Интернет>Веб-форма, чтобы добавить новую веб-форму. Присвойте форме имя Proxy.aspx.
В файле Proxy.aspx замените весь HTML-элемент и его дочерние элементы следующим HTML-кодом. Оставьте всю разметку над HTML-элементом без изменений. HTML-код содержит разметку и скрипт JavaScript, который выполняет следующие задачи:
Предоставляет заполнитель для файла междоменной библиотеки JavaScript.
Извлекает URL-адрес сайта надстройки из источника ссылки.
Динамически загружает файл JavaScript междоменной библиотеки в заполнитель.
Предоставляет параметры для объекта RequestExecutorMessageProcessor.
Инициализирует объект RequestExecutorMessageProcessor.
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <title>Custom Proxy Host Page</title> <script src="http://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"> </script> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"> </script> <!-- Script to load the cross-domain library js file --> <script type="text/javascript"> var hostweburl; $(document).ready(function(){ //Get the URI decoded host web URL. hostweburl = decodeURIComponent( getQueryStringParameter("SPHostUrl") ); // The cross-domain js file is in a URL in the form: // host_web_url/_layouts/15/SP.RequestExecutor.js var scriptbase = hostweburl + "/_layouts/15/"; // Load the js file $.getScript(scriptbase + "SP.RequestExecutor.js", initCustomProxy); }); //Function to initialize the custom proxy page // must set the appropriate settings and implement // proper authentication mechanism function initCustomProxy() { var settings = { originAuthorityValidator: function (messageOriginAuthority) { // This page must implement the authentication for the // remote add-in. // You should validate if messageOriginAuthority is // an approved domain to receive calls from. return true; } }; SP.RequestExecutorMessageProcessor.init(settings); } // Function to retrieve a query string value. // For production purposes you may want to use // a library to handle the query string. function getQueryStringParameter(paramToRetrieve) { var params = document.URL.split("?")[1].split("&"); var strParams = ""; for (var i = 0; i < params.length; i = i + 1) { var singleParam = params[i].split("="); if (singleParam[0] == paramToRetrieve) return singleParam[1]; } } </script> </head> <body> </body> </html>
Важно!
В производственной надстройке SharePoint необходимо предоставить логику авторизации и вернуть соответствующее значение в объект originAuthorityValidator в параметрах.
Создание страницы содержимого
Щелкните правой кнопкой мыши проект веб-приложения в Обозреватель решений и добавьте новую веб-форму, выбрав Добавить>веб-форму>нового элемента>. Назовите форму Content.aspx.
Скопируйте следующий код и вставьте его в метод Page_Load в файл с выделенным кодом. Этот код выполняет следующие задачи.
Устанавливает для content-type значение text/plain.
Записывает контент в выходной буфер.
Завершает подключение.
string content; content = "Just some text."; Response.ContentType="text/plain"; Response.Write(content); Response.End();
Создание веб-страницы SharePoint, использующей междоменную библиотеку
Щелкните правой кнопкой мыши проект надстройки SharePoint и выберите Добавить>Новый элемент>Office/SharePoint>Модуль.
Присвойте модулю имя Pages и нажмите Добавить.
Щелкните папку Pages правой кнопкой мыши и выберите Добавить>Новый элемент>Office/SharePoint>Страница.
Задайте для страницы имя Home.aspx и нажмите кнопку Добавить.
Если страница Home.aspx не открылась автоматически, откройте ее.
Скопируйте указанный ниже код и вставьте его в тег содержимого PlaceHolderMain.
<!-- The page dynamically loads the cross-domain library's js file, rescript acts as the placeholder. --> <script type="text/javascript" id="rescript" src="../_layouts/15/SP.RequestExecutor.js"> </script> Data from the remote domain: <span id="TextData"></span> <!-- Main script to retrieve the host web's title --> <script type="text/javascript"> (function () { var executor; var hostweburl; var remotedomain; remotedomain = "<your_remote_add-in_domain>"; //Get the URI decoded host web URL. hostweburl = decodeURIComponent( getQueryStringParameter("SPHostUrl") ); // Initialize the RequestExecutor with the custom proxy URL. executor = new SP.RequestExecutor(remotedomain); executor.iFrameSourceUrl = "Proxy.aspx?SPHostUrl=" + hostweburl; // Issue the call against the remote endpoint. // The response formats the data in plain text. // The functions successHandler and errorHandler attend the // sucess and error events respectively. executor.executeAsync( { url: remotedomain + "Content.aspx", method: "GET", headers: { "Accept": "text/plain" }, success: successHandler, error: errorHandler } ); })(); // Function to handle the success event. // Prints the data to the placeholder. function successHandler(data) { document.getElementById("TextData").innerText = data.body; } // Function to handle the error event. // Prints the error message to the page. function errorHandler(data, errorCode, errorMessage) { document.getElementById("TextData").innerText = "Could not complete cross-domain call: " + errorMessage; } // Function to retrieve a query string value. // For production purposes you may want to use // a library to handle the query string. function getQueryStringParameter(paramToRetrieve) { var params = document.URL.split("?")[1].split("&"); var strParams = ""; for (var i = 0; i < params.length; i = i + 1) { var singleParam = params[i].split("="); if (singleParam[0] == paramToRetrieve) return singleParam[1]; } } </script>
В вставленном выше коде найдите строку
remotedomain = "<your_remote_add-in_domain>";
и замените заполнитель <your_remote_add-in_domain> URL-адресом localhost, который используется веб-приложением при запуске надстройки с F5 в Visual Studio. Для этого выберите проект веб-приложения в обозревателе решений. Свойство URL-адреса находится в области Свойства . Используйте все значение, включая протокол, порт и закрывающая косая черта; напримерhttp://localhost:45072
.Сохраните и закройте файл.
Откройте файл appmanifest.xml и задайте для параметра Начальная страница значение ProxyPageApp/Pages/Home.aspx.
Сборка и запуск решения
Убедитесь, что проект надстройки SharePoint выбран как запускаемый проект.
Нажмите клавишу F5.
Примечание.
При нажатии клавиши F5 Visual Studio выполняет сборку решения, развертывает надстройку и открывает страницу разрешений.
Нажмите кнопку Доверять.
Откроется домашняя страница, и она должна выглядеть следующим образом. Может потребоваться несколько секунд, чтобы появилась фраза "Just some text", так как она извлекается со страницы Content.aspx удаленного домена.
Устранение неполадок в решении
Проблема | Решение |
---|---|
Visual Studio не открывает браузер после нажатия клавиши F5. | Сделайте проект надстройки SharePoint запускаемым. |
Необработанное исключение SP не определен. | Убедитесь, что у вас есть доступ к файлу SP.RequestExecutor.js в окне браузера. |