Azure active directory 使用Microsoft Graph API和MSAL auth在OneDrive上保存文档

Azure active directory 使用Microsoft Graph API和MSAL auth在OneDrive上保存文档,azure-active-directory,onedrive,microsoft-graph-api,msal,Azure Active Directory,Onedrive,Microsoft Graph Api,Msal,我和同事正在开发的一个应用程序生成一些PDF文件,并将结果流式传输回客户端。此MVC应用程序仅针对一个特定客户 其想法是集中将PDF文件导出到OneDrive(用于业务),以便客户可以在任何时间、任何地点、任何设备上查看文档 是否可以将Microsoft Graph API与msal身份验证(v2.0端点)结合使用来完成此任务? 我们可以考虑将业务作为“中央存储”解决方案吗? 对于小企业 谢谢您的建议。我假设您使用的是C#应用程序的一些变体(ASP.NET、UWP、Xamarin)。在任何一种情

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

其想法是集中将PDF文件导出到OneDrive(用于业务),以便客户可以在任何时间、任何地点、任何设备上查看文档

是否可以将Microsoft Graph API与msal身份验证(v2.0端点)结合使用来完成此任务?
我们可以考虑将业务作为“中央存储”解决方案吗? 对于小企业


谢谢您的建议。

我假设您使用的是C#应用程序的一些变体(ASP.NET、UWP、Xamarin)。在任何一种情况下,你所尝试的都是可能的

和都使用MSAL演示身份验证,并结合使用Microsoft Graph Client Library for.NET的各种Microsoft Graph调用。两者都有在OneDrive上上载、下载、更新和其他操作的示例


如果您使用的是.NET以外的其他平台/语言,MSAL将不适用,但Github上有供您签出的平台/语言。其中几个演示了v2.0身份验证端点的使用。

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

    }
}
publicstaticvoidcreateItem(stringaccessToken)
{
字符串itemCreateUri=”https://graph.microsoft.com/v1.0/me/drive/root/children";
string itemData=“{\“name\”:\“book2.pdf\”,\“file\”:{}”;
var itemCreatedResult=RestrequeSetHelper.RestrequeSetHelper.PostAsync(itemCreateUri,itemData,accessToken).Result;
DriveItem=新的DriveItem(itemCreatedResult);
字符串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(fs);
var uploadResult=restrequesethelper.restrequesethelper.SendHttpRequest(HttpVerb.PUT,itemUploadUri,streamContent,accessToken).Result;
fs.Close();
}
公共静态异步任务PostAsync(字符串uri、字符串jsonBody、字符串accessToken)
{
返回等待发送HttpRequest(HttpVerb.POST、uri、jsonBody、accessToken);
}
私有静态异步任务SendHttpRequest(HttpVerb版本、字符串uri、字符串jsonBody、字符串accessToken)
{
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.Authorization=new System.Net.Http.Headers.AuthenticationHeaderValue(“bearer”,$“{accessToken}”);
var stringContent=newstringcontent(jsonBody,Encoding.UTF8,“application/json”);
if(ver==HttpVerb.POST)
{
return wait client.PostAsync(uri,stringContent).ContinueWith((响应)=>
{
返回response.Result.Content.ReadAsStringAsync().Result;
});
}
其他的
{
return wait client.PutAsync(uri,stringContent).ContinueWith((响应)=>
{
返回response.Result.Content.ReadAsStringAsync().Result;
});
}
}
公共静态异步任务SendHttpRequest(HttpVerb版本、字符串uri、StreamContent蒸汽体、字符串accessToken)
{
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.Authorization=new System.Net.Http.Headers.AuthenticationHeaderValue(“bearer”,$“{accessToken}”);
if(ver==HttpVerb.POST)
{
return wait client.PostAsync(uri,steamBody).ContinueWith((响应)=>
{
返回response.Result.Content.ReadAsStringAsync().Result;
});
}
其他的
{
return wait client.PutAsync(uri,steamBody).ContinueWith((响应)=>
{
返回response.Result.Content.ReadAsStringAsync().Result;
});
}
}
}

感谢您的快速响应,罗伯特。PDF文档是在Web API C#部件上生成的,需要使用MSAL和Graph API将其上载到OneDrive。(我在文章中假设这些技术是目前的最佳选择。)这些操作应该在没有UI交互的情况下进行。最重要的是,JensMSAL需要通过身份验证UI流运行,并通过用户为您的应用程序授予权限。假设您维护返回的刷新令牌,您可以继续刷新访问令牌一段时间。一旦您拥有访问令牌,对图形的调用就不需要用户交互。有几种方法可用于从守护程序/服务对图形进行身份验证,而无需用户流。你也可以看看,谢谢。真的需要只有应用程序的作用域进行身份验证,没有UI交互。希望团队能够带来这个特性