顯示使用者檔案

已完成

在使用者可以下載檔案之前,我們需要顯示可用檔案的清單。 在本單元中,檔案將位在使用者商務用 OneDrive 的根目錄。 您可以將一或兩個檔案拖放到這裡來開始。 您可以瀏覽至 https://www.office.com,登入並選取 OneDrive 圖示,以存取您的商務用 OneDrive。

決定您的應用程式所需的權限

Microsoft Graph 公開的所有資料都受到保護,而且您的應用程式必須獲與適當權限才能存取它。 需要的權限取決於您的應用程式需要存取的資訊類型。 例如,若要存取使用者的行事曆,您的應用程式必須擁有 Calendars.Read 權限。 若要讀取使用者的檔案,您的應用程式需要 Files.Read 權限。 後續到了應上傳檔案時,您的應用程式將需要 Files.ReadWrite 權限。 Microsoft Graph API 參考中提供每項作業所需權限的確切清單。

如果您的應用程式載入不同類型的資料,使用者將必須授與其存取此資訊所需的多個權限。 建議您僅在應用程式中要求您需要的權限。

指定必要權限

授與您應用程式的權限清單會一併放入存取權杖中。 OAuth 標準將其稱為「範圍」。 當您的應用程式使用 MSAL 來取得存取權杖,它需要在對 Azure Active Directory 的要求中包含範圍清單。 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.json 擷取 Scopes 屬性中定義的必要權限。
  2. 新增 OpenId 驗證的支援。
  3. 指定應用程式是需要驗證碼流程的 Microsoft 身分識別平台 Web 應用程式。
  4. 新增使用特定權限呼叫 Microsoft Graph API 的能力。
  5. 啟用 GraphServiceClient 的相依性插入 (Microsoft Graph SDK 提供的物件,用來進行 Microsoft Graph 呼叫)。
  6. 新增記憶體內部權杖快取。
  7. 需要已驗證的使用者存取應用程式。
  8. 啟用 Razor Pages 支援。
  9. 新增提供使用者登入和登出支援的 Microsoft 身分識別 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 之類的捷徑。

若要列舉其他使用者文件資料夾中的檔案,您會需要使用者的使用者識別碼及其文件資料夾的項目識別碼,如下所示:

/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 根資料夾中的檔案清單。