使用 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;
});
}
}
}
我和我的同事正在开发的一个应用程序生成一些 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;
});
}
}
}