显示用户文件

已完成

在用户可以下载文件之前,我们需要显示可用文件的列表。 在此学习模块中,文件将位于用户的 OneDrive for Business 根目录中。 你可能想要将一两个文件放到该处以开始学习。 你可以通过浏览到 https://www.office.com、登录并选择 OneDrive 图标来访问你的 OneDrive for Business。

确定应用需要哪些权限

Microsoft Graph 公开的所有数据都受到保护,并且应用必须获得相应权限才能访问这些数据。 所需的权限取决于应用需要访问的信息类型。 例如,若要访问用户的日历,应用需要具有 Calendars.Read 权限。 若要读取用户的文件,应用需要 Files.Read 权限。 稍后,当需要上传文件时,应用将需要 Files.ReadWrite 权限。 Microsoft Graph API 参考提供了每个操作所需权限的具体列表。

如果应用加载不同类型的数据,则用户必须向其授予访问此信息所需的多个权限。 建议在应用中仅请求所需的权限。

指定必要的权限

授予应用的权限列表将直接放入访问令牌中。 OAuth 标准将它们称为“范围”。 当应用程序使用 MSAL 获取访问令牌时,它需要在对 Microsoft Entra ID 的请求中包含范围列表。 Microsoft Graph 中的每个操作都有其自己的范围列表。 如果你的访问令牌没有其中一个,请求将被拒绝。

示例应用程序将所需的权限存储在 appsettings.json 文件的 Scopes 属性中,如你之前所见。

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

Scopes 属性值由应用的 ASP.NET Core 中间件使用,该中间件处理在用户成功登录后检索访问令牌。

中间件:Microsoft 标识平台和 Microsoft Graph

ASP.NET Core 支持可用于对用户进行身份验证和授权的中间件。 它还可用于检索令牌,该令牌可用于调用 Microsoft Graph、将名为 GraphServiceClient 的 Microsoft Graph SDK 对象注入应用程序、以及创建令牌缓存等。 中间件在 Startup.cs 中配置并处理以下任务。

  1. 检索 appsettings.jsonScopes 属性中定义的必需权限。
  2. 添加对 OpenId 身份验证的支持。
  3. 指定该应用程序是一个需要身份验证代码流的 Microsoft 标识平台 Web 应用。
  4. 添加调用具有特定权限的 Microsoft Graph API 的能力。
  5. GraphServiceClient 启用依赖注入 (一个由 Microsoft Graph SDK 提供的对象,用于进行 Microsoft Graph 调用)。
  6. 添加内存中令牌缓存。
  7. 要求经过身份验证的用户访问应用。
  8. 启用 Razor Pages 支持。
  9. 添加提供用户登录和注销支持的 Microsoft Identity UI 页面。

可以在 Startup.csConfigureServices() 方法中定义的以下代码中查看上述每个步骤。

// 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();

使用 Microsoft Graph 检索用户 OneDrive 根目录中的文件

配置所需的中间件后,应用程序将自动处理用户登录和检索访问令牌。 然后,访问令牌可用于检索用户的文件,因为它将包含所需的权限。 让我们看一下此过程的工作原理。

若要获取用户的文件,请使用 /me/drive/root/children 资源。 获取当前用户 OneDrive 根目录中的文件更容易,因为 Microsoft Graph 提供 /me/root等快捷方式。

若要枚举其他用户的“文档”文件夹中的文件,则需要用户的用户 ID 及其“文档”文件夹的项目 ID,如下所示:

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

提示

Microsoft Graph 提供了对 OneDrive、OneDrive for Business 和 SharePoint Online 中的文件的访问权限。 Microsoft Teams 和其他 Microsoft 365 服务将文件存储在 OneDrive for Business 和 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 for Business 根文件夹中的文件列表。