1

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

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

是否可以将 Microsoft Graph API 与 msal 身份验证(v2.0 端点)结合使用来完成此操作?
我们可以将 OneDrive for Business 视为小型企业的“中央存储”解决方案吗?

谢谢你的任何建议。:)

4

2 回答 2

1

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

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

这是一个示例,供您将 PDF 上传到 OneDrive 以供参考:

   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;
            });
        }

    }
}
于 2016-08-05T09:59:24.820 回答
1

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

UWP Snippets 示例Xamarin Snippets 示例都演示了使用 MSAL 以及使用 Microsoft Graph Client Library for .NET 的各种 Microsoft Graph 调用的身份验证。两者也都有在 OneDrive 上进行上传、下载、更新等操作的示例。

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

于 2016-08-04T21:12:01.253 回答