Создание настраиваемой страницы прокси для междоменной библиотеки в SharePoint

При создании надстроек SharePoint обычно необходимо объединять данные из различных источников. Тем не менее, из соображений безопасности существуют механизмы блокировки, которые препятствуют связи более чем с одним доменом одновременно.

Вы можете использовать междоменную библиотеку для доступа к данным в удаленной надстройке, если реализуете настраиваемую прокси-страницу, размещенную в инфраструктуре удаленной надстройки. Как разработчик вы отвечаете за реализацию настраиваемой прокси-страницы и пользовательской логики, например, за механизм проверки подлинности для удаленной надстройки. Используйте междоменную библиотеку с настраиваемой прокси-страницей, если необходимо, чтобы взаимодействие происходило на уровне клиента.

Необходимые условия для использования примеров в этой статье

Вам необходима среда разработки, описанная в статье Создание надстроек SharePoint, размещаемых у поставщика.

Ключевые понятия, с которыми необходимо ознакомиться перед использованием настраиваемой страницы прокси вместе с надстройками SharePoint

Ниже перечислены полезные статьи, в которых описано, как запрашивать данные для надстроек SharePoint из удаленного домена.

Название статьи Описание
Надстройки SharePoint Сведения о новой модели надстроек в SharePoint, с помощью которой можно создавать небольшие и удобные в использовании надстройки для пользователей.
Безопасный доступ к данным и клиентские объектные модели для надстроек SharePoint Узнайте о параметрах доступа к данным в Надстройки SharePoint. В этой статье представлена информация об альтернативах высокого уровня при работе с данными в надстройке.
Хост-сайты, сайты надстроек и компоненты SharePoint в SharePoint Узнайте, в чем разница между хост-сайтами и сайтами надстроек. Узнайте, какие компоненты SharePoint можно включать в надстройку для SharePoint, какие компоненты разворачиваются на хост-сайте, какие компоненты разворачиваются на сайте надстройки, и как выполняется развертывание сайта надстройки в изолированном домене.
Междоменная безопасность на стороне клиента Изучите междоменные угрозы и примеры использования, а также принципы безопасности для междоменных запросов, и оцените риски разработчиков, связанные с улучшением междоменного доступа из веб-приложений, которые запускаются в браузере.

Пример кода. Доступ к удаленным данным с помощью настраиваемой прокси-страницы для междоменной библиотеки

Чтобы прочесть данные из удаленной службы, выполните указанные ниже действия.

  1. Создайте проект надстройки для SharePoint.

  2. Измените манифест надстройки, чтобы разрешить связь с удаленной надстройкой.

  3. Создать настраиваемую прокси-страницу и страницу контента в веб-проекте.

  4. Создать страницу, которая использует междоменную библиотеку в проекте Надстройка SharePoint.

Создание проекта надстройки SharePoint

  1. Откройте Visual Studio от имени администратора. (Для этого щелкните правой кнопкой мыши значок Visual Studio в меню Пуск и выберите Запуск от имени администратора.)

  2. Создайте надстройку SharePoint с размещением у поставщика, как описано в этой статье, и назовите ее ProxyPageApp.

Изменение файла манифеста надстройки

  1. В обозревателе решений щелкните правой кнопкой мыши файл AppManifest.xml и выберите Просмотреть код.

  2. Замените весь элемент AppPrincipal указанным ниже фрагментом.

    <AppPrincipal>
        <Internal AllowedRemoteHostUrl="~remoteAppUrl"/>
    </AppPrincipal>
    

Примечание.

Атрибут AllowedRemoteHostUrl используется для указания удаленного домена. ~remoteAppUrl принимает значение URL-адреса удаленной надстройки. Дополнительные сведения о маркерах см. в статье Изучение структуры манифеста приложения и пакета надстройки SharePoint.

Создание настраиваемой страницы прокси

  1. После создания решения Visual Studio щелкните правой кнопкой мыши проект веб-приложения (не проект надстройки SharePoint) и выберите Добавить>Новый элемент>Интернет>Веб-форма, чтобы добавить новую веб-форму. Присвойте форме имя Proxy.aspx.

  2. В файле 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("&amp;");
                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 в параметрах.

Создание страницы содержимого

  1. Щелкните правой кнопкой мыши проект веб-приложения в Обозреватель решений и добавьте новую веб-форму, выбрав Добавить>веб-форму>нового элемента>. Назовите форму Content.aspx.

  2. Скопируйте следующий код и вставьте его в метод Page_Load в файл с выделенным кодом. Этот код выполняет следующие задачи.

    • Устанавливает для content-type значение text/plain.

    • Записывает контент в выходной буфер.

    • Завершает подключение.

    string content;
    content = "Just some text.";
    Response.ContentType="text/plain";
    Response.Write(content);
    Response.End();
    
    

Создание веб-страницы SharePoint, использующей междоменную библиотеку

  1. Щелкните правой кнопкой мыши проект надстройки SharePoint и выберите Добавить>Новый элемент>Office/SharePoint>Модуль.

  2. Присвойте модулю имя Pages и нажмите Добавить.

  3. Щелкните папку Pages правой кнопкой мыши и выберите Добавить>Новый элемент>Office/SharePoint>Страница.

  4. Задайте для страницы имя Home.aspx и нажмите кнопку Добавить.

  5. Если страница Home.aspx не открылась автоматически, откройте ее.

  6. Скопируйте указанный ниже код и вставьте его в тег содержимого 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("&amp;");
            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>
    
    

  7. В вставленном выше коде найдите строку remotedomain = "<your_remote_add-in_domain>";и замените заполнитель <your_remote_add-in_domain> URL-адресом localhost, который используется веб-приложением при запуске надстройки с F5 в Visual Studio. Для этого выберите проект веб-приложения в обозревателе решений. Свойство URL-адреса находится в области Свойства . Используйте все значение, включая протокол, порт и закрывающая косая черта; например http://localhost:45072.

  8. Сохраните и закройте файл.

  9. Откройте файл appmanifest.xml и задайте для параметра Начальная страница значение ProxyPageApp/Pages/Home.aspx.

Сборка и запуск решения

  1. Убедитесь, что проект надстройки SharePoint выбран как запускаемый проект.

  2. Нажмите клавишу F5.

    Примечание.

    При нажатии клавиши F5 Visual Studio выполняет сборку решения, развертывает надстройку и открывает страницу разрешений.

  3. Нажмите кнопку Доверять.

    Откроется домашняя страница, и она должна выглядеть следующим образом. Может потребоваться несколько секунд, чтобы появилась фраза "Just some text", так как она извлекается со страницы Content.aspx удаленного домена.

    Страница SharePoint с данными из удаленной службы

Устранение неполадок в решении

Проблема Решение
Visual Studio не открывает браузер после нажатия клавиши F5. Сделайте проект надстройки SharePoint запускаемым.
Необработанное исключение SP не определен. Убедитесь, что у вас есть доступ к файлу SP.RequestExecutor.js в окне браузера.

См. также