Создание надстройки Office, в которой используется единый вход, на платформе ASP.NET

Пользователи могут входить в Office, а веб-надстройка Office может воспользоваться этим процессом входа, чтобы авторизовать пользователей в надстройке и Microsoft Graph, не требуя от пользователей повторного входа. В этой статье описывается процесс включения единого входа (SSO) в надстройке.

В этом примере показано, как создать следующие части:

  • Клиентский код, предоставляющий область задач, которая загружается в Microsoft Excel, Word или PowerPoint. Клиентский код вызывает API getAccessToken() Office JS для получения маркера доступа единого входа для вызова rest API на стороне сервера.
  • Код на стороне сервера, использующий ASP.NET Core для предоставления одного REST API /api/files. Код на стороне сервера использует библиотеку проверки подлинности Майкрософт для .NET (MSAL.NET) для обработки всех маркеров, проверки подлинности и авторизации.

В примере используется единый вход и поток On-Behalf-Of (OBO) для получения правильных маркеров доступа и вызова API Microsoft Graph. Если вы не знаете, как работает этот поток, дополнительные сведения см. в статье Как работает единый вход во время выполнения .

Предварительные требования

  • Visual Studio 2019 или более поздней версии.

  • Рабочая нагрузка разработки Office/SharePoint при настройке Visual Studio.

  • По крайней мере несколько файлов и папок, хранящихся в OneDrive для бизнеса в подписке Microsoft 365.

  • Сборка Microsoft 365, поддерживающая набор требований IdentityAPI 1.3. Вы можете получить подписку на Microsoft 365 E5 разработчика, которая включает в себя песочницу для разработчиков, в рамках программы разработчика Microsoft 365. Дополнительные сведения см. в разделе Вопросы и ответы. Песочница разработчика включает подписку Microsoft Azure, которую можно использовать для регистрации приложений на последующих шагах в этой статье. При желании для регистрации приложений можно использовать отдельную подписку Microsoft Azure. Получите пробную подписку на Microsoft Azure.

Настройка начального проекта

Клонируйте или скачайте репозиторий Office Add-in ASPNET SSO.

Примечание.

Существует две версии примера.

  • Папка Begin является начальным проектом. Пользовательский интерфейс и другие аспекты надстройки, не связанные непосредственно с единым входом и авторизацией, уже готовы. В последующих разделах этой статьи рассматривается доработка проекта.
  • Папка Complete содержит один и тот же пример со всеми инструкциями по написанию кода из этой статьи. Чтобы использовать готовую версию, просто следуйте инструкциям, приведенным в этой статье, но замените "Begin" на "Complete" и пропустите разделы Код на стороне клиента и Код на стороне сервера.

Используйте следующие значения заполнителей для последующих шагов регистрации приложения.

Заполнитель Значение
<add-in-name> Office-Add-in-ASPNET-SSO
<fully-qualified-domain-name> localhost:44355
Разрешения Microsoft Graph profile, openid, Files.Read

Регистрация надстройки с помощью платформа удостоверений Майкрософт

Необходимо создать регистрацию приложения в Azure, представляющего веб-сервер. Это обеспечивает поддержку проверки подлинности, чтобы в коде клиента в JavaScript можно было выдавать правильные маркеры доступа. Эта регистрация поддерживает как единый вход в клиенте, так и резервную проверку подлинности с помощью библиотеки проверки подлинности Майкрософт (MSAL).

  1. Войдите в портал Azure с учетными данными администратора в клиенте Microsoft 365. Например, MyName@contoso.onmicrosoft.com.

  2. Выберите Регистрация приложений. Если значок не отображается, найдите "регистрация приложения" в строке поиска.

    Домашняя страница портал Azure.

    Появится страница регистрации приложений.

  3. Выберите Новая регистрация.

    Новая регистрация на панели Регистрация приложений.

    Появится страница Регистрация приложения.

  4. На страницеЗарегистрировать приложение задайте необходимые значения следующим образом.

    • Введите имя<add-in-name>.
    • Задайте для значения Поддерживаемые типы учетных записейзначение Учетные записи в любом каталоге организации (любой каталог Azure AD — мультитенантный) и личных учетных записей Майкрософт (например, Skype, Xbox).
    • Задайте URI перенаправления, чтобы использовать одностраничное приложение платформы (SPA), а URI — .https://<fully-qualified-domain-name>/dialog.html

    Зарегистрируйте область приложения с именем и поддерживаемой учетной записью.

  5. Нажмите Зарегистрировать. Появится сообщение о том, что регистрация приложения создана.

    Сообщение о том, что регистрация приложения создана.

  6. Скопируйте и сохраните значения идентификатора приложения (клиента) и идентификатора каталога (клиента). Они понадобятся вам позже.

    Область регистрации приложений для Contoso с идентификатором клиента и идентификатором каталога.

Добавление секрета клиента

Секрет клиента, который иногда называется паролем приложения, — это строковое значение, которое приложение может использовать вместо сертификата для идентификации себя.

  1. В области слева выберите Сертификаты & секреты. Затем на вкладке Секреты клиента выберите Новый секрет клиента.

    Область

    Откроется панель Добавление секрета клиента .

  2. Добавьте описание секрета клиента.

  3. Выберите срок действия секрета или укажите пользовательское время существования.

    • Время существования секрета клиента ограничено двумя годами (24 месяцами) или менее. Нельзя указать пользовательское время существования, превышающее 24 месяца.
    • Корпорация Майкрософт рекомендует установить срок действия менее 12 месяцев.

    Добавьте область секретов клиента с описанием и истекает срок действия.

  4. Нажмите Добавить. Создается новый секрет, а значение временно отображается.

Важно!

Запишите значение секрета для использования в коде клиентского приложения. Это значение секрета больше не отображается после выхода из этой области.

Предоставление веб-API

  1. В области слева выберите Предоставить API.

    Откроется панель Предоставление API .

    Область Предоставления API для регистрации приложения.

  2. Выберите Задать , чтобы создать универсальный код ресурса (URI) идентификатора приложения.

    Кнопка

    Раздел для задания URI идентификатора приложения отображается с созданным URI идентификатора приложения в формате api://<app-id>.

  3. Обновите URI идентификатора приложения на api://<fully-qualified-domain-name>/<app-id>.

    Измените область URI идентификатора приложения, указав для порта localhost значение 44355.

    • URI идентификатора приложения предварительно заполняется идентификатором приложения (GUID) в форматеapi://<app-id>.
    • Формат URI идентификатора приложения должен иметь следующий формат: api://<fully-qualified-domain-name>/<app-id>
    • Вставьте между fully-qualified-domain-nameapi:// и <app-id> (который является GUID). Например, api://contoso.com/<app-id>.
    • Если вы используете localhost, формат должен иметь формат api://localhost:<port>/<app-id>. Например, api://localhost:3000/c6c1f32b-5e55-4997-881a-753cc1d563b7.

    Дополнительные сведения о URI идентификатора приложения см. в разделе Идентификатор манифеста приложения.

    Примечание.

    Если возникает ошибка с сообщением о том, что домен уже занят, но при этом вы являетесь его владельцем, следуйте процедуре в статье Краткое руководство. Добавление имени личного домена в Azure Active Directory, чтобы зарегистрировать его, а затем повторите этот шаг. (Эта ошибка также может возникнуть, если вы не выполнили вход с учетными данными администратора в клиенте Microsoft 365. См. шаг 2. Выйдите и снова войдите с учетными данными администратора и повторите процесс из шага 3.)

Добавление область

  1. На странице Предоставление API выберите Добавить область.

    Нажмите кнопку Добавить область.

    Откроется панель Добавление область.

  2. В области Добавление область укажите атрибуты область. В следующей таблице показаны примеры значений для надстройки и Outlook, для которых требуются profileразрешения , openid, Files.ReadWriteи Mail.Read . Измените текст в соответствии с разрешениями, которые требуются надстройке.

    Поле Описание Values
    Имя области Имя область. Общее соглашение об именовании область — .resource.operation.constraint Для единого входа необходимо задать значение access_as_user.
    Кто может согласиться Определяет, требуется ли согласие администратора или пользователи могут предоставить согласие без одобрения администратора. Для изучения единого входа и примеров рекомендуется задать для этого параметра значение Администраторы и пользователи.

    Выберите Администраторы только для более привилегированных разрешений.
    отображаемое имя согласия Администратор Краткое описание назначения область, видимое только администраторам. Read/write permissions to user files. Read permissions to user mail and profiles.
    описание согласия Администратор Более подробное описание разрешения, предоставленного область, которое видят только администраторы. Allow Office to have read/write permissions to all user files and read permissions to all user mail. Office can call the app's web APIs as the current user.
    Отображаемое имя согласия пользователя Краткое описание назначения область. Отображается для пользователей только в том случае, если для администраторов и пользователей задан параметр Кто может предоставить согласие. Read/write permissions to your files. Read permissions to your mail and profile.
    Описание согласия пользователя Более подробное описание разрешения, предоставляемого область. Отображается для пользователей только в том случае, если для администраторов и пользователей задан параметр Кто может предоставить согласие. Allow Office to have read/write permissions to your files, and read permissions to your mail and profile.
  3. Задайте для параметра Состояниезначение Включено, а затем выберите Добавить область.

    Задайте для параметра Состояние включено и нажмите кнопку Добавить область.

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

    Новая область отображается на панели Предоставление API.

    Примечание.

    Доменная часть имени области, отображаемая непосредственно под текстовым полем, должна автоматически соответствовать URI идентификатора приложения, заданного на предыдущем шаге, с добавлением /access_as_user в конце, например: api://localhost:6789/c6c1f32b-5e55-4997-881a-753cc1d563b7/access_as_user.

  4. Выберите Добавить клиентское приложение.

    Выберите Добавить клиентское приложение.

    Откроется панель Добавление клиентского приложения .

  5. В поле Идентификатор клиента введите ea5a67f6-b6f3-4338-b240-c655ddc3cc8e. Это значение предварительно разрешает все конечные точки приложений Microsoft Office. Если вы также хотите предварительно авторизовать Office при использовании в Microsoft Teams, добавьте 1fec8e78-bce4-4aaf-ab1b-5451cc387264 (Microsoft Teams desktop и Teams mobile) и 5e3ce6c0-2b1f-4285-8d4b-75ee78787346 (Teams в Интернете).

    Примечание.

    Идентификатор ea5a67f6-b6f3-4338-b240-c655ddc3cc8e предварительно авторизует Office на всех следующих платформах. Кроме того, можно ввести соответствующее подмножество следующих идентификаторов, если по какой-либо причине вы хотите запретить авторизацию Office на некоторых платформах. В этом случае оставьте идентификаторы платформ, с которых вы хотите удержать авторизацию. Пользователи надстройки на этих платформах не смогут вызывать веб-API, но другие функции надстройки по-прежнему будут работать.

    • d3590ed6-52b3-4102-aeff-aad2292ab01c (Microsoft Office).
    • 93d53678-613d-4013-afc1-62e9e444a0a5 (Office в Интернете).
    • bc59ab01-8403-45c6-8796-ac3ef710b3e3 (Outlook в Интернете).
  6. В разделе Авторизованные области установите api://<fully-qualified-domain-name>/<app-id>/access_as_user флажок.

  7. Нажмите кнопку Добавить приложение.

    Панель Добавление клиентского приложения.

Добавление разрешений Microsoft Graph

  1. В области слева выберите Разрешения API.

    Область разрешений API.

    Откроется область разрешений API .

  2. Выберите Добавить разрешение.

    Добавление разрешения на область разрешений API.

    Откроется область Запрашивать разрешения API .

  3. Выберите Microsoft Graph.

    Панель Запрашивать разрешения API с помощью кнопки Microsoft Graph.

  4. Выберите Делегированные разрешения.

    Панель Запрашивать разрешения API с делегированными разрешениями.

  5. В поле поиска Выбор разрешений найдите разрешения, необходимые надстройке. Например, для надстройки Outlook можно использовать profile, , openidFiles.ReadWriteи Mail.Read.

    Примечание.

    Разрешение User.Read может быть уже указано по умолчанию. Рекомендуется запрашивать только необходимые разрешения, поэтому рекомендуется снять флажок для этого разрешения, если надстройка не нуждается в нем.

  6. Установите флажки для каждого разрешения, как оно отображается. Обратите внимание, что разрешения не будут отображаться в списке при выборе каждого из них. Выбрав разрешения, необходимые надстройке, выберите Добавить разрешения.

    Область Запрашивать разрешения API с выбранными разрешениями.

  7. Выберите Предоставить согласие администратора для [имя клиента]. Выберите Да , чтобы появилось подтверждение.

Настройка версии маркера доступа

Необходимо определить версию маркера доступа, приемлемую для вашего приложения. Эта конфигурация выполняется в манифесте приложения Azure Active Directory.

Определение версии маркера доступа

Версия маркера доступа может измениться, если вы выбрали тип учетной записи, отличной от Учетные записи в любом каталоге организации (любой каталог Azure AD — мультитенантный), и личные учетные записи Майкрософт (например, Skype, Xbox). Выполните следующие действия, чтобы убедиться, что версия маркера доступа правильна для использования единого входа Office.

  1. В левой области выберите Манифест.

    Выберите Манифест Azure.

    Откроется манифест приложения Azure Active Directory.

  2. Введите 2 в качестве значения свойства accessTokenAcceptedVersion.

    Значение для принятой версии маркера доступа.

  3. Нажмите кнопку Сохранить.

    В браузере появится сообщение об успешном обновлении манифеста.

    Сообщение об обновлении манифеста.

Поздравляем! Вы завершили регистрацию приложения, чтобы включить единый вход для надстройки Office.

Настройка решения

  1. В корневой папке Begin откройте файл решения (.sln) в Visual Studio. В обозревателе решений щелкните правой кнопкой мыши верхний узел (узел решения, а не узлы проектов) и выберите Назначить запускаемые проекты.

  2. В разделе Общие свойства выберите Запускаемый проект, а затем Несколько запускаемых проектов. Убедитесь, что для параметра Действие для обоих проектов задано значение Пуск, а проект Office-Add-in-ASPNETCoreWebAPI указан первым. Закройте диалоговое окно.

  3. В Обозреватель решений выберите проект Office-Add-in-ASPNET-SSO-manifest и откройте файл манифеста надстройки "Office-Add-in-ASPNET-SSO.xml", а затем прокрутите его вниз. Сразу над конечным </VersionOverrides> тегом вы найдете следующую разметку.

    <WebApplicationInfo>
         <Id>Enter_client_ID_here</Id>
     	<Resource>api://localhost:44355/Enter_client_ID_here</Resource>
     	<Scopes>
            <Scope>Files.Read</Scope>
     		<Scope>profile</Scope>
            <Scope>openid</Scope>
     	</Scopes>
     </WebApplicationInfo>
    
  4. Замените заполнитель "Enter_client_ID_here" в обоих местах разметки идентификатором приложения , скопированным при создании регистрации приложения Office-Add-in-ASPNET-SSO . Это тот же идентификатор, который использовался для идентификатора приложения в файле appsettings.json.

    Примечание.

    Значение <ресурса> — это универсальный код ресурса (URI) идентификатора приложения , заданный при регистрации надстройки. Раздел <Области> используется только для создания диалогового окна согласия, если надстройка продается через AppSource.

  5. Сохраните и закройте файл манифеста.

  6. В Обозреватель решений выберите проект Office-Add-in-ASPNET-SSO-web и откройте файл appsettings.json.

  7. Замените заполнитель Enter_client_id_here значением идентификатора приложения (клиента), сохраненным ранее.

  8. Замените заполнитель Enter_client_secret_here значением секрета клиента, сохраненным ранее.

    Примечание.

    Кроме того, необходимо изменить Идентификатор клиента для поддержки одного клиента, если вы настроили регистрацию приложения для одного клиента. Замените значение Commonидентификатором приложения (клиента) для поддержки с одним клиентом.

  9. Сохраните и закройте файл appsettings.json.

Код на стороне клиента

Получение маркера доступа и вызов REST API сервера приложений

  1. В проекте Office-Add-in-ASPNETCore-WebAPI откройте файлwwwroot\js\HomeES6.js . В нем уже есть код, гарантирующий поддержку обещаний, даже в элементе управления webview Trident (Интернет-Обозреватель 11), а Office.onReady также вызов, чтобы назначить обработчик единственной кнопке надстройки.

    Примечание.

    Как следует из названия, HomeES6.js использует синтаксис JavaScript ES6, так как использование async и await лучше всего показывает основную простоту API единого входа. При запуске сервера localhost этот файл преобразуется в синтаксис ES5, чтобы пример поддерживал Trident.

  2. В функции getUserFileNames замените TODO 1 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • Он вызывает Office.auth.getAccessToken для получения маркера доступа из Office с помощью единого входа. Этот маркер будет содержать удостоверение пользователя, а также разрешение на доступ к серверу приложений.
    • Передается маркер доступа, callRESTApi который выполняет фактический вызов к серверу приложений. Затем сервер приложений использует поток OBO для вызова Microsoft Graph.
    • Все ошибки при вызове getAccessToken будут обрабатываться .handleClientSideErrors
       let fileNameList = null;
    try {
        let accessToken = await Office.auth.getAccessToken(options);
        fileNameList = await callRESTApi("/api/files", accessToken);
    }
    catch (exception) {
        if (exception.code) {
            handleClientSideErrors(exception);
        }
        else {
            showMessage("EXCEPTION: " + exception);
        }
    }
    
    
  3. В функции getUserFileNames замените TODO 2 приведенным ниже кодом. При этом список имен файлов будет записываться в документ.

     try {
         await writeFileNamesToOfficeDocument(fileNameList);
         showMessage("Your data has been added to the document.");
     } catch (error) {
         // The error from writeFileNamesToOfficeDocument will begin 
         // "Unable to add filenames to document."
         showMessage(error);
     }
    
  4. В функции callRESTApi замените TODO 3 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • Он создает заголовок авторизации, содержащий маркер доступа. Это подтверждает сервер приложений, что этот клиентский код имеет разрешения на доступ к REST API.
    • Он запрашивает типы возвращаемых данных JSON, чтобы все возвращаемые значения обрабатывались в формате JSON.
    • Все ошибки передаются handleServerSideErrors для обработки.
     try {
         let result = await $.ajax({
             url: relativeUrl,
             headers: { "Authorization": "Bearer " + accessToken },
             type: "GET",
             dataType: "json",
             contentType: "application/json; charset=utf-8"
         });
         return result;
     } catch (error) {
         handleServerSideErrors(error);
     }
    

Обработка ошибок единого входа и ошибок REST API приложения

  1. В функции handleSSOErrors замените TODO 4 приведенным ниже кодом. Дополнительные сведения об этих ошибках см. в статье Устранение ошибок единого входа в надстройках Office.

     switch (error.code) {
         case 13001:
             // No one is signed into Office. If the add-in cannot be effectively used when no one 
             // is logged into Office, then the first call of getAccessToken should pass the 
             // `allowSignInPrompt: true` option.
             showMessage("No one is signed into Office. But you can use many of the add-ins functions anyway. If you want to log in, press the Get OneDrive File Names button again.");
             break;
         case 13002:
             // The user aborted the consent prompt. If the add-in cannot be effectively used when consent
             // has not been granted, then the first call of getAccessToken should pass the `allowConsentPrompt: true` option.
             showMessage("You can use many of the add-ins functions even though you have not granted consent. If you want to grant consent, press the Get OneDrive File Names button again.");
             break;
         case 13006:
             // Only seen in Office on the web.
             showMessage("Office on the web is experiencing a problem. Please sign out of Office, close the browser, and then start again.");
             break;
         case 13008:
             // Only seen in Office on the web.
             showMessage("Office is still working on the last operation. When it completes, try this operation again.");
             break;
         case 13010:
             // Only seen in Office on the web.
             showMessage("Follow the instructions to change your browser's zone configuration.");
             break;
         default:
             // For all other errors, including 13000, 13003, 13005, 13007, 13012, and 50001, fall back
             // to non-SSO sign-in by using MSAL authentication.
             showMessage("SSO failed. In these cases you should implement a falback to MSAL authentication.");
             break;
     }
    
  2. В функции handleServerSideErrors замените TODO 5 приведенным ниже кодом.

    // Check headers to see if admin has not consented.
    const header = errorResponse.getResponseHeader('WWW-Authenticate');
    if (header !== null && header.includes('proposedAction=\"consent\"')) {
        showMessage("MSAL ERROR: " + "Admin consent required. Be sure admin consent is granted on all scopes in the Azure app registration.");
        return;
    }
    
    
  3. В функции handleServerSideErrors замените TODO 6 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • В некоторых случаях требуется дополнительное согласие, например 2FA. Удостоверение Майкрософт возвращает дополнительные утверждения, необходимые для заполнения согласия. Этот код добавляет authChallenge свойство с дополнительными утверждениями и снова вызывает getUserfileNames . При getAccessToken повторном вызове с дополнительными утверждениями пользователь получает запрос на все необходимые формы проверки подлинности.
    // Check if Microsoft Graph requires an additional form of authentication. Have the Office host 
    // get a new token using the Claims string, which tells Microsoft identity to prompt the user for all 
    // required forms of authentication.
    const errorDetails = JSON.parse(errorResponse.responseJSON.value.details);
    if (errorDetails) {
        if (errorDetails.error.message.includes("AADSTS50076")) {
            const claims = errorDetails.message.Claims;
            const claimsAsString = JSON.stringify(claims);
            getUserFileNames({ authChallenge: claimsAsString });
            return;
        }
    }
    
  4. В функции handleServerSideErrors замените TODO 7 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • В редких случаях срок действия исходного маркера единого входа истек, он обнаружит это условие ошибки и вызовет getUserFilenames снова. Это приводит к еще одному вызову, который getAccessToken возвращает обновленный маркер доступа. Переменная retryGetAccessToken подсчитывает повторные попытки и в настоящее время настроена на повторную попытку только один раз.
    • Наконец, если ошибка не может быть обработана, по умолчанию она отображается в области задач.
    // Results from other errors (other than AADSTS50076) will have an ExceptionMessage property.
    const exceptionMessage = JSON.parse(errorResponse.responseText).ExceptionMessage;
    if (exceptionMessage) {
        // On rare occasions the access token is unexpired when Office validates it,
        // but expires by the time it is sent to Microsoft identity in the OBO flow. Microsoft identity will respond
        // with "The provided value for the 'assertion' is not valid. The assertion has expired."
        // Retry the call of getAccessToken (no more than once). This time Office will return a 
        // new unexpired access token.
        if ((exceptionMessage.includes("AADSTS500133"))
            && (retryGetAccessToken <= 0)) {
            retryGetAccessToken++;
            getUserFileNames();
            return;
        }
        else {
            showMessage("MSAL error from application server: " + JSON.stringify(exceptionMessage));
            return;
        }
    }
    // Default error handling if previous checks didn't apply.
    showMessage(errorResponse.responseJSON.value);
    
  5. Сохраните файл.

Код на стороне сервера

Код на стороне сервера — это сервер ASP.NET Core, который предоставляет интерфейсы REST API для вызова клиентом. Например, REST API /api/files получает список имен файлов из папки OneDrive пользователя. Каждому вызову REST API требуется маркер доступа клиента, чтобы убедиться, что правильный клиент обращается к своим данным. Маркер доступа обменивается на маркер Microsoft Graph через поток On-Behalf-Of (OBO). Новый токен Microsoft Graph кэшируется библиотекой MSAL.NET для последующих вызовов API. Он никогда не отправляется за пределы кода на стороне сервера. В документации по удостоверениям Майкрософт этот сервер называется сервером среднего уровня, так как он находится в центре потока от клиентского кода к службам Майкрософт. Дополнительные сведения см. в разделе Запрос маркера доступа среднего уровня.

Настройка потока Microsoft Graph и OBO

  1. Program.cs Откройте файл и замените TODO 8 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • Она добавляет необходимые службы для обработки проверки маркеров, которая требуется для REST API.
    • Она добавляет поддержку потока Microsoft Graph и OBO в вызове .EnableTokenAcquisitionToCallDownstreamApi().AddMicrosoftGraph(...) Поток OBO обрабатывается автоматически, а пакет SDK для Microsoft Graph предоставляется контроллерам REST API.
    • Конфигурация DownstreamApi указана в файле appsettings.json .
    // Add services to the container.
    builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
                    .EnableTokenAcquisitionToCallDownstreamApi()
                        .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi"))
                        .AddInMemoryTokenCaches();
    
    

Создание REST API /api/filenames

  1. В папке Controllers откройте файл FilesController.cs . замените TODO 9 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • Он задает [Authorize] атрибут, гарантирующий проверку маркера доступа для каждого вызова любых REST API в FilesController классе . Дополнительные сведения см. в разделе Проверка маркеров.
    • Он указывает [RequiredScope("access_as_user")] атрибут , чтобы убедиться, что клиент имеет правильный access_as_user область в маркере доступа.
    • Конструктор инициализирует объект , _graphServiceClient чтобы упростить вызов ИНТЕРФЕЙСов REST API Microsoft Graph.
    [Authorize]
    [Route("api/[controller]")]
    [RequiredScope("access_as_user")]
    public class FilesController : Controller
    {        
        public FilesController(ITokenAcquisition tokenAcquisition, GraphServiceClient graphServiceClient, IOptions<MicrosoftGraphOptions> graphOptions)
        {
            _tokenAcquisition = tokenAcquisition;
            _graphServiceClient = graphServiceClient;
            _graphOptions = graphOptions;
    
        }
    
        private readonly ITokenAcquisition _tokenAcquisition;
        private readonly GraphServiceClient _graphServiceClient;
        private readonly IOptions<MicrosoftGraphOptions> _graphOptions;
    
        // TODO 10: Add the REST API to get filenames.
    
    }
    
  2. Замените TODO 10 приведенным ниже кодом. Вот что нужно знать об этом коде:

    • Он создает /api/files REST API.
    • Он обрабатывает исключения из MSAL через MsalException класс.
    • Он обрабатывает исключения из вызовов Microsoft API Graph через ServiceException класс .
     // GET api/files
        [HttpGet]
        [Produces("application/json")]
        public async Task<IActionResult> Get()
        {
            List<DriveItem> result = new List<DriveItem>();
            try
            {
                var files = await _graphServiceClient.Me.Drive.Root.Children.Request()
                    .Top(10)
                    .Select(m => new { m.Name })
                    .GetAsync();
    
                result = files.ToList();
            }
            catch (MsalException ex)
            {
                var errorResponse = new
                {
                    message = "An authentication error occurred while acquiring a token for downstream API",
                    details = ex.Message
                };
    
                return StatusCode((int)HttpStatusCode.Unauthorized, Json(errorResponse));
            }
            catch (ServiceException ex)
            {
                if (ex.InnerException is MicrosoftIdentityWebChallengeUserException challengeException)
                {
                    _tokenAcquisition.ReplyForbiddenWithWwwAuthenticateHeader(_graphOptions.Value.Scopes.Split(' '),
                        challengeException.MsalUiRequiredException);
                }
                else
                {
                    var errorResponse = new
                    {
                        message = "An error occurred calling Microsoft Graph",
                        details = ex.RawResponseBody
                    };
                    return StatusCode((int)HttpStatusCode.BadRequest, Json(errorResponse));
                }
            }
            catch (Exception ex)
            {
                var errorResponse = new
                {
                    message = "An error occurred while calling the downstream API",
                    details = ex.Message
                };
                return StatusCode((int)HttpStatusCode.BadRequest, Json(errorResponse));
    
            }
            return Json(result);
        }
    

Запуск решения

  1. В Visual Studio в меню Сборка выберите Очистить решение. После выполнения команды снова откройте меню Построение и выберите команду Построить решение.

  2. В Обозреватель решений выберите узел проекта Office-Add-in-ASPNET-SSO-manifest.

  3. В области Свойства откройте раскрывающийся список Начальный документ и выберите один из трех вариантов (Excel, Word или PowerPoint).

    Выберите нужное клиентское приложение Office: Excel, PowerPoint или Word.

  4. Нажмите клавишу F5. Или выберите Отладка > Начать отладку.

  5. В приложении Office выберите Показать надстройку в группе единый вход ASP.NET , чтобы открыть надстройку области задач.

  6. Выберите Получить имена файлов OneDrive. Если вы вошли в Office с помощью Microsoft 365 для образования или рабочей учетной записи или учетной записи Майкрософт и единый вход работает должным образом, первые 10 имен файлов и папок в OneDrive для бизнеса отображаются в области задач. Если вы не вошли в систему или находитесь в сценарии, который не поддерживает единый вход, или единый вход не работает по какой-либо причине, вам будет предложено выполнить вход. После входа отображаются имена файлов и папок.

Развертывание надстройки

Когда вы будете готовы к развертыванию на промежуточном или рабочем сервере, обязательно обновите следующие области в решении проекта.

  • В файле appsettings.json измените домен на имя промежуточного или рабочего домена.
  • Обновите все ссылки на localhost:7080 в проекте, чтобы использовать промежуточный или рабочий URL-адрес.
  • Обновите все ссылки на localhost:7080 в регистрации приложение Azure или создайте новую регистрацию для использования в промежуточной или рабочей среде.

Дополнительные сведения см. в статье Размещение и развертывание ASP.NET Core.

См. также