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

本文关键字:构建 ADAL 最新 代码 实验性 | 更新日期: 2023-09-27 18:03:14

我使用的是Microsoft.Experimental.IdentityModel.Clients。ActiveDirectory Nuget包认证到Outlook.com API,然而,像一个月前,所有的成员定义在OutlookServicesClient.Me急剧停止工作未知的原因(如:OutlookServicesClient.Me.MailFolders.Where(predicate).ExecuteSingleAsync())抛出一种服务器请求失败的错误消息没有有用的信息,所以出于这个原因,我想尝试常规库:Microsoft.IdentityModel.Clients。ActiveDirectory,看看它是否可以自动解决问题,只是使用它,而不是尝试使用实验构建。

我遇到的问题是试图迁移下面的下一个代码,这是基于实验构建的语法。我没有发现AcquireTokenAsync函数的任何过载,我可以指定Outlook范围,我没有找到其他方法来做到这一点,AcquireTokenAsync函数的第一个参数也期望resource字符串参数,我不确定我必须放在那里。

我看到了使用AcquireTokenAsync的官方和第三方示例,但我很困惑,试图适应它们,因为resource参数或其他东西,我不确定它们是如何工作的,也,我看到的许多示例都是为ASP。. NET,但我使用的是Windows Forms


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

VB。NET版本(原始代码)

Dim scopes As String() = {
    "https://outlook.office.com/mail.read",
    "https://outlook.office.com/mail.readwrite",
    "https://outlook.office.com/mail.send"
}
Dim cache As New TokenCache()
Dim authContext As New AuthenticationContext("https://login.microsoftonline.com/common", cache)
Dim authResult As AuthenticationResult = 
    Await authContext.AcquireTokenAsync(scopes, Nothing, "*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(Me.authResult.Token))

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

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

这是我的翻译意图,它不工作第一,因为我不知道在哪里设置三个Outlook范围url,其次,因为当我接受微软的许可web表单,它说它不能处理由于无效的请求。(我将resource参数设置为Nothing/nul)

VB。NET版本(原始代码)

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

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

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

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

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

这里有一个例子供你参考:

通过NuGet安装包:Install-Package Microsoft.Identity.Client -pre

检索令牌的示例代码:
   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桌面应用程序