gpt4 book ai didi

c# - 将实验性 ADAL 构建中的代码调整为最新的 ADAL 构建

转载 作者:行者123 更新时间:2023-11-30 17:36:44 25 4
gpt4 key购买 nike

我正在使用 Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory 用于对 Outlook.com API 进行身份验证的 Nuget 程序包,但是,就像一个月前一样,OutlookServicesClient.Me 中定义的所有成员都因未知原因急剧停止工作(例如: OutlookServicesClient.Me.MailFolders.Where(predicate).ExecuteSingleAsync()) 抛出一种没有有用信息的服务器请求失败错误消息,因此出于这个原因我想尝试常规库: <强> Microsoft.IdentityModel.Clients.ActiveDirectory 看看它是否可以通过使用它自动解决问题,而不是尝试使用实验版本。

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

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


这是我需要迁移/更新到新的 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,其次是因为当我接受 Microsoft 的许可 Web 表单时它说由于请求无效,无法处理。 (我将 Nothing/nul resource 参数设置为)

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

最佳答案

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

这里有一个例子供您引用:

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

获取 token 的示例代码:

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

}
}

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

关于c# - 将实验性 ADAL 构建中的代码调整为最新的 ADAL 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39063083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com