Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实验性ADAL构建中的代码改编为最新的ADAL构建_C#_.net_Outlook_Office365_Office365api - Fatal编程技术网

C# 将实验性ADAL构建中的代码改编为最新的ADAL构建

C# 将实验性ADAL构建中的代码改编为最新的ADAL构建,c#,.net,outlook,office365,office365api,C#,.net,Outlook,Office365,Office365api,我使用Nuget包对Outlook.comAPI进行身份验证,但是,就像一个月前一样,OutlookServicesClient.Me中定义的所有成员都因为未知的原因(例如:OutlookServicesClient.Me.MailFolders.Where(谓词).ExecuteSingleAsync())抛出一种没有有用信息的服务器请求失败错误消息,因此,出于这个原因,我想尝试常规库:,看看它是否可以通过使用该库自动解决问题,而不是尝试使用实验构建 我遇到的问题是尝试迁移下面的代码,这是基于

我使用Nuget包对Outlook.comAPI进行身份验证,但是,就像一个月前一样,
OutlookServicesClient.Me
中定义的所有成员都因为未知的原因(例如:
OutlookServicesClient.Me.MailFolders.Where(谓词).ExecuteSingleAsync()
)抛出一种没有有用信息的服务器请求失败错误消息,因此,出于这个原因,我想尝试常规库:,看看它是否可以通过使用该库自动解决问题,而不是尝试使用实验构建

我遇到的问题是尝试迁移下面的代码,这是基于实验构建的语法。我没有发现
AcquireTokenAsync
函数有任何重载,我可以在该函数上指定Outlook作用域,我也没有找到其他方法来执行此操作,而且
AcquireTokenAsync
函数的第一个参数需要一个
资源
字符串参数,我不确定必须放在那里

我看到了使用
AcquireTokenAsync
的官方和第三方示例,但我对如何调整它们感到困惑,因为
资源
参数或其他我不确定它们如何工作的东西,而且,我看到的许多示例都是针对ASP.NET,但我使用的是Windows窗体


这是我需要迁移/更新到新ADAL语法和方法重载的代码:

VB.NET版本(原始代码)

C#版本(未经测试的在线翻译)


这是我的翻译意图,首先它不起作用,因为我不知道在哪里设置三个Outlook范围URL,其次是因为当我接受Microsoft的权限web表单时,它表示由于请求无效而无法处理该表单。(我将
资源
参数设置为
/
num

VB.NET版本(原始代码)

C#版本(未经测试的在线翻译)


要使用V2端点对客户端应用程序进行身份验证,我们可以使用MSAL数据库

以下是一个示例供您参考:

通过NuGet安装软件包:
安装软件包Microsoft.Identity.Client-预安装

检索令牌的示例代码:

   public static async void GetToken()
    {
        string clientId = "0cfa4d3e-db48-400f-9b44-901cd5975312";
        var app = new PublicClientApplication(clientId);
        AuthenticationResult result = null;
        try
        {
            string[] scopes = {
                    "https://outlook.office.com/mail.read",
                    "https://outlook.office.com/mail.readwrite",
                    "https://outlook.office.com/mail.send"
                };

            result = await app.AcquireTokenAsync(scopes);
            Console.WriteLine(result.Token);
        }
        catch (MsalException ex)
        {

        }
    }

和是添加登录到Windows桌面应用程序的详细示例。

谢谢您的回答,但我不明白您在
Microsoft.Identity.Client
时告诉我要做什么。Client与
Microsoft.IdentityModel.Clients.ActiveDirectory
是不同的命名空间和库,我使用的是
AuthenticationContext
要连接到的类,但该类似乎未在您提到的库中定义。除此之外,我不明白为什么Microsoft发布了各种库,它们似乎具有相同的目的。事实上,所有这些都让我感到困惑,我只想修改上面的代码,不替换整个库以了解新用法新方法及其语法和参数等。使用我随代码收到的令牌,它会抛出一个异常,错误消息资源未找到,用于段“Folders”,使用以下简单调用:
Dim Folders As IPagedCollection(属于IFolder)=等待Microsoft.OData库的client.Me.Folders.ExecuteAsync()
。现在我收到另一条错误消息:“OData请求不受支持”,但什么东西不支持,MSAL?我很困惑。@ElektroStudios我遇到了与1.5年前相同的问题。您是如何解决的?@casaout这里我将提供一个用VB.NET编写的完整解决方案。它由两个枚举和一个“客户端”类组成,该类连接/登录Outlook帐户,并支持基本的通用使用操作,如获取邮件文件夹名称、删除邮件等。在该类中,您可以检查
异步授权
函数+
string[] scopes = {
    "https://outlook.office.com/mail.read",
    "https://outlook.office.com/mail.readwrite",
    "https://outlook.office.com/mail.send"
};

TokenCache cache = new TokenCache();

AuthenticationContext authContext = 
    new AuthenticationContext("https://login.microsoftonline.com/common", cache);

AuthenticationResult authResult = 
    Await authContext.AcquireTokenAsync(scopes, null, "*Client ID*", 
                                        new Uri("urn:ietf:wg:oauth:2.0:oob"), 
                                        new PlatformParameters(PromptBehavior.Auto));

OutlookServicesClient client = 
    new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0"), 
                              () => Task.FromResult(authResult.Token));
Dim cache As New TokenCache()
Dim authContext As New AuthenticationContext("https://login.microsoftonline.com/common", cache)
Dim authResult As AuthenticationResult = 
    Await authContext.AcquireTokenAsync(resource???, "*Client ID*", 
                                        New Uri("urn:ietf:wg:oauth:2.0:oob"),
                                        New PlatformParameters(PromptBehavior.Auto))

Dim client As New OutlookServicesClient(New Uri("https://outlook.office.com/api/v2.0"), 
                                        Function() Task.FromResult(authResult.AccessToken))
TokenCache cache = new TokenCache();

AuthenticationContext authContext = 
    new AuthenticationContext("https://login.microsoftonline.com/common", cache);

AuthenticationResult authResult = 
    Await authContext.AcquireTokenAsync(resource???, "*Client ID*", 
                                        new Uri("urn:ietf:wg:oauth:2.0:oob"), 
                                        new PlatformParameters(PromptBehavior.Auto));

OutlookServicesClient client = 
    new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0"), 
                              () => Task.FromResult(authResult.AccessToken));
   public static async void GetToken()
    {
        string clientId = "0cfa4d3e-db48-400f-9b44-901cd5975312";
        var app = new PublicClientApplication(clientId);
        AuthenticationResult result = null;
        try
        {
            string[] scopes = {
                    "https://outlook.office.com/mail.read",
                    "https://outlook.office.com/mail.readwrite",
                    "https://outlook.office.com/mail.send"
                };

            result = await app.AcquireTokenAsync(scopes);
            Console.WriteLine(result.Token);
        }
        catch (MsalException ex)
        {

        }
    }