使用 Microsoft Graph API 和 MSAL 身份验证将文档保存在 OneDrive 上

Save documents on OneDrive using Microsoft Graph API and MSAL auth

我和我的同事正在开发的一个应用程序生成一些 PDF 文件并将结果流式传输回客户端。此 MVC 应用程序仅针对一位特定客户。

想法是将 PDF 文件集中导出到 OneDrive(商务版),以便客户可以随时随地在任何设备上查看文档。

是否可以将 Microsoft Graph API 与 msal 身份验证(v2.0 端点)结合使用来完成此操作?
我们能否将 OneDrive for Business 视为 "central storage" 解决方案 对于小型企业?

感谢您的任何建议。:)

我假设您正在使用 C# 应用程序的某些变体(ASP.NET、UWP、Xamarin)。在任何这些情况下,您尝试做的事情绝对有可能。

两个 UWP Snippets sample and the Xamarin Snippets sample 都演示了使用 MSAL 结合使用适用于 .NET 的 Microsoft Graph 客户端库的各种 Microsoft Graph 调用的身份验证。两者也都有在OneDrive上进行上传、下载、更新等操作的示例。

如果您使用的是 .NET 以外的其他平台/语言,MSAL 将不适用,但 many other samples Github 上有供您查看。其中一些演示了 v2.0 身份验证端点的使用。

v2 身份验证端点目前不支持在没有 UI 交互的情况下进行身份验证的纯应用范围。您可以通过登录 Azure AD 使用 Microsoft 身份验证库 (MSAL) 获取访问令牌和刷新令牌。然后您可以使用访问令牌和刷新令牌 whiteout 用户进行交互。

刷新令牌的有效期为14天,连续使用,有效期可达90天。 90 天后,将要求用户重新进行身份验证。

这里有一个示例,供您参考将PDF上传到OneDrive for business:

   public static void CreateItem(string accessToken)
    {
        string itemCreateUri = "https://graph.microsoft.com/v1.0/me/drive/root/children";
        string itemData = "{\"name\":\"book2.pdf\",\"file\":{}}";
        var itemCreatedResult = RESTRequsetHelper.RESTRequsetHelper.PostAsync(itemCreateUri, itemData, accessToken).Result;
        DriveItem item = new DriveItem(itemCreatedResult);

        string itemUploadUri= $"https://graph.microsoft.com/v1.0/me/drive/items/{item.Id}/content";

        System.IO.FileStream fs = System.IO.File.Open(@"C:\users\user1\desktop\book1.pdf",System.IO.FileMode.Open);
        StreamContent streamContent = new StreamContent(fs);
        var uploadResult= RESTRequsetHelper.RESTRequsetHelper.SendHttpRequest(HttpVerb.PUT, itemUploadUri, streamContent, accessToken).Result;

        fs.Close();

    }

  public static async Task<string> PostAsync(string uri, string jsonBody, string accessToken)
    {
        return await SendHttpRequest(HttpVerb.POST, uri, jsonBody, accessToken);
    }

   private static async Task<string> SendHttpRequest(HttpVerb ver, string uri, string jsonBody, string accessToken)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", $"{accessToken}");
        var stringContent = new StringContent(jsonBody,Encoding.UTF8,"application/json");

        if (ver == HttpVerb.POST)
        {
            return await client.PostAsync(uri, stringContent).ContinueWith<string>((response) =>
           {
               return response.Result.Content.ReadAsStringAsync().Result;
           });
        }
        else
        {
            return await client.PutAsync(uri, stringContent).ContinueWith<string>((response) =>
            {
                return response.Result.Content.ReadAsStringAsync().Result;
            });
        }

    }

    public static async Task<string> SendHttpRequest(HttpVerb ver, string uri, StreamContent steamBody, string accessToken)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", $"{accessToken}");

        if (ver == HttpVerb.POST)
        {
            return await client.PostAsync(uri, steamBody).ContinueWith<string>((response) =>
            {
                return response.Result.Content.ReadAsStringAsync().Result;
            });
        }
        else
        {
            return await client.PutAsync(uri, steamBody).ContinueWith<string>((response) =>
            {
                return response.Result.Content.ReadAsStringAsync().Result;
            });
        }

    }
}