C# 使用OneDrive API的正确方法是什么?

C# 使用OneDrive API的正确方法是什么?,c#,azure,onedrive,C#,Azure,Onedrive,我想在WinForms应用程序中与OneDrive交互。遗憾的是,Azure quick start示例不包括WinForms,只包括UWD 我必须执行的流程是一致的,即给定我的客户ID,我必须获得身份验证代码。给定身份验证代码,然后我可以获得一个访问代码,这将允许我以RESTful方式与OneDriveAPI进行交互。我的计划是让身份验证部分进入.Net Framework库,文件IO调用将进入另一个没有用户界面访问权限的库,就像它进入Windows服务一样。我将把访问令牌传递给服务 AADS

我想在WinForms应用程序中与OneDrive交互。遗憾的是,Azure quick start示例不包括WinForms,只包括UWD

我必须执行的流程是一致的,即给定我的
客户ID
,我必须获得
身份验证代码。给定身份验证代码,然后我可以获得一个
访问代码
,这将允许我以RESTful方式与
OneDrive
API进行交互。我的计划是让身份验证部分进入
.Net Framework库
,文件IO调用将进入另一个没有用户界面访问权限的库,就像它进入Windows服务一样。我将把访问令牌传递给服务

AADSTS50059: No tenant-identifying information found in either the request or implied by any provided credentials.
此错误对应于我从示例.Net核心守护程序快速启动代码中提取的以下代码片段

注意:我一直在使用
Scopes
来处理,因为我一直在接收范围错误,我看到了一篇文章,其中一篇文章应该保留它的链接,该文章声明使用API和默认范围

public bool GetRestAuthenticationToken(out string tokenAuthentication)
    {
        tokenAuthentication = null;
        try
        {
            IConfidentialClientApplication app;
            app = ConfidentialClientApplicationBuilder.Create(Authenticate.AppClientId)
                                                      .WithClientSecret(Authenticate.AppClientSecret)
                                                      .WithAuthority(new Uri(@"https://login.microsoftonline.com/common/oauth2/nativeclient"))
                                                      .Build();


            string scope = $"onedrive.readwrite offline_access";
            System.Collections.Generic.List<string> enumScopes = new System.Collections.Generic.List<string>();
            enumScopes.Add("api://<GUID>/.default");
            //enumScopes.Add(Authenticate.Scopes[1]);
            var result = Task.Run(async () => await app.AcquireTokenForClient(enumScopes).ExecuteAsync()).Result;
            ...
        }
        ...
}
目标是相同的,即获得一个访问令牌,我可以使用
RESTful
调用来处理OneDrive上的文件和/或目录,例如

            System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
            client.GetAsync(...);

您正在尝试实现客户端凭据授予类型以获取访问令牌

基于,
权限

可选)供用户验证的STS端点。通常 对于公共云,在哪里 {tenant}是租户的名称或租户Id

我们假设您的租户是“myTenent.onmicrosoft.com”,那么您应该将其设置为
https://login.microsoftonline.com/myTenent.onmicrosoft.com
这里


我注意到您在代码中指定了一个作用域“onedrive.readwrite”。但它不是Microsoft Graph的有效权限。Microsoft Graph的默认范围是
https://graph.microsoft.com/.default

Azure不关心您是在使用Winforms还是其他API。而且,毫不奇怪,您的问题似乎没有提到任何导致您麻烦的Winforms的具体内容。我已经从帖子中删除了Winforms特定的描述符。我想下载一些类似于postman的东西。最后,一切都应该是RESTFul API。使用诸如postman之类的工具,您可以快速测试API调用。@Ron我看不到任何名为postman的快速入门。如果您想让我看看使用RESTful API处理OneDrive API,我很乐意这样做,只是我没有找到任何示例。说“邮递员”没有帮助。请提供一个URL。Postman是一个第三方软件,它还可以为您提供c#代码以拨打某些电话。下面是关于onedrive API的另一个StackOverflow。请尝试使用客户端凭据流来获取postman中的访问令牌:我希望看到的是一个可以工作的RESTful API。问题是,几乎所有的.Net代码都是基于UWD的,而我的应用程序是WinForms。很抱歉,社区取消了WinForms,是的,WinForms,但这带来了巨大的不同。我的当前代码抛出一个警告,即Microsoft.Graph/Identity代码是UWD,无法工作。说“myTenant”是有帮助的,但如果没有代码来支持,我就不能再往前走了。@SarahWeinberger您的意思是想要一个WinForms示例吗?
            System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
            client.GetAsync(...);