Отображение файлов пользователей

Завершено

Прежде чем пользователь сможет скачать файл, необходимо отобразить список доступных файлов. В этом модуле файлы будут находиться в корневом каталоге OneDrive для бизнеса пользователя. Вам стоит для начала перенести туда один или два файла. Для получения доступа к OneDrive для бизнеса перейдите на страницу https://www.office.com, выполните вход и щелкните значок OneDrive.

Выбор разрешений, необходимых вашему приложению

Все данные, предоставляемые из Microsoft Graph, защищены, и вашему приложению должны быть предоставлены соответствующие разрешения на доступ к ним. Необходимые разрешения зависят от типа сведений, к которым приложение должно получить доступ. Например, для доступа к календарю пользователя у вашего приложения должно быть разрешение Calendars.Read. Для чтения файлов пользователя вашему приложению требуется разрешение Files.Read. Позже, когда придет время отправить файлы, вашему приложению потребуется разрешение Files.ReadWrite. Точный список разрешений, необходимых для каждой операции, доступен в справочнике по API Microsoft Graph.

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

Указание необходимых разрешений

Список разрешений, предоставленных вашему приложению, включается прямо в маркер доступа. В стандарте OAuth они называются "областями". Когда приложение использует MSAL для получения маркера доступа, оно должно включить список областей в запрос к идентификатору Microsoft Entra. У каждой операции в Microsoft Graph есть собственный список областей. Если у маркера доступа нет одной из них, запрос отклоняется.

В примере приложения необходимые разрешения сохраняются в файле appsettings.json в свойстве Scopes, как было показано ранее.

"Scopes": "user.read presence.read mailboxsettings.read files.readwrite"

Значение свойства Scopes используется в ПО промежуточного слоя ASP.NET Core приложения, где обрабатывается получение маркера доступа после успешного входа пользователя.

ПО промежуточного слоя: платформа удостоверений Майкрософт и Microsoft Graph

ASP.NET Core поддерживает ПО промежуточного слоя, которое можно использовать для проверки подлинности и авторизации пользователей. Оно также может использоваться для получения маркера, применимого для вызова Microsoft Graph, вставки в приложение объекта Microsoft Graph SDK под именем GraphServiceClient, создания кэша маркеров и для других целей. ПО промежуточного слоя настроено в Startup.cs и выполняет указанные ниже задачи.

  1. Извлечение из appsettings.json необходимых разрешений, определенных в свойстве Scopes.
  2. Добавление поддержки проверки подлинности OpenId.
  3. Указание, что приложение является веб-приложением платформы удостоверений Майкрософт, требующим потока кода проверки подлинности.
  4. Добавление возможности вызывать API Microsoft Graph с определенными разрешениями.
  5. Включение внедрения зависимостей для GraphServiceClient (объект из пакета SDK Майкрософт Graph, используемый для вызовов Microsoft Graph).
  6. Добавление кэша маркеров в памяти.
  7. Требование проверки подлинности пользователя для доступа к приложению.
  8. Включение поддержки Razor Pages.
  9. Добавление страниц пользовательского интерфейса платформы удостоверений Майкрософт, которые обеспечивают поддержку входа и выхода пользователя.

Каждое из этих действий можно увидеть в следующем коде, определенном в методе ConfigureServices() файлаStartup.cs.

// 1. Retrieve required permissions from appsettings
string[] initialScopes =
Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');


services
  // 2. Add support for OpenId authentication
  .AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)

  // 3. Microsoft identity platform web app that requires an auth code flow
  .AddMicrosoftIdentityWebApp(Configuration)

  // 4. Add ability to call Microsoft Graph APIs with specific permissions
  .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)

  // 5. Enable dependency injection for GraphServiceClient
  .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))

  // 6. Add in-memory token cache
  .AddInMemoryTokenCaches();


// 7. Require an authenticated user
services.AddControllersWithViews(options =>
{
  var policy = new AuthorizationPolicyBuilder()
      .RequireAuthenticatedUser()
      .Build();
  options.Filters.Add(new AuthorizeFilter(policy));
});

services
  // 8. Add Razor Pages support
  .AddRazorPages()

  // 9. Add Microsoft Identity UI pages that provide user
  // sign-in and sign-out support
  .AddMicrosoftIdentityUI();

Извлечение файлов из корневого каталога OneDrive пользователя с помощью Microsoft Graph

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

Чтобы получить файлы пользователя, используйте ресурс /me/drive/root/children. Немного проще получить файлы из корневой папки OneDrive текущего пользователя, так как Microsoft Graph предоставляет такие ярлыки, как /me и /root.

Для перечисления файлов из папки Документы другого пользователя потребуется ИД пользователя и ИД элемента его папки Документы, как показано далее:

/users/{user-id}/drive/items/{item-id}/children

Совет

Microsoft Graph предоставляет доступ к файлам из OneDrive, OneDrive для бизнеса и SharePoint Online. Microsoft Teams и другие службы Microsoft 365 хранят файлы в OneDrive для бизнеса и SharePoint Online. Операции с файлами одинаковы, но ресурсы (URL-адреса) немного отличаются для каждой из этих служб.

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

var response = await _graphServiceClient.Me.Drive.Root.Children
    .Request()
    .GetAsync();

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

var response = await _graphServiceClient.Me.Drive.Root.Children
    .Request()
    .Select(file => new
    {
        file.Id,
        file.Name,
        file.Folder,
        file.Package
    })
    .GetAsync();

Указанный ниже код можно использовать для получения файлов для другого пользователя при наличии соответствующих разрешений безопасности:

var response = await _graphServiceClient
  .Users[userId]
  .Drive
  .Items[itemId]
  .Children
  .Request()
  .Select(file => new
  {
    file.Id,
    file.Name,
    file.Folder,
    file.Package
  })
  .GetAsync();

Дальнейшие действия

Давайте рассмотрим на практике все изученное вами и расширим возможности вашего приложения для отображения списка файлов из корневой папки OneDrive для бизнеса пользователя.