如何在.NET框架中获取用于OAuth连接的令牌?

问题描述 投票:0回答:1

我有几个 Web 服务向某些 API 发出 http 请求。他们正在使用 OAuth 2.0。

Web 服务 (.NET 6) 使用

Microsoft.Identity.Client
获取访问令牌,如下所示:

var clientId = "some-id";
var clientSecret = "some-secret";
var authority = "https://login.microsoftonline.com/my-domain";
var scope = "api://my-resource/.default";

string[] scopes = new string[] { scope };

IConfidentialClientApplication app;
app = ConfidentialClientApplicationBuilder.Create(clientId)
   .WithClientSecret(clientSecret)
   .WithAuthority(new Uri(authority))
   .Build();

AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync();

var token = result.AccessToken

该令牌是有效的,它允许我的 Web 服务使用

HttpClient
访问 API。它运行完美。

现在我遇到了一个问题:有一个旧版 .NET 框架应用程序无法更新到 .NET Core,并且它还需要仅使用 Microsoft 库来访问 API。

我尝试使用

Microsoft.IdentityModel.Clients.ActiveDirectory
和这段代码:

var clientId = "some-id";
var clientSecret = "some-secret";
var authority = "https://login.microsoftonline.com/my-domain";
var scope = "api://my-resource/.default";

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
var authContext = new AuthenticationContext(authority);
var clientCredential = new ClientCredential(clientId, clientSecret);
var result = await authContext.AcquireTokenAsync(scope, clientCredential);

var token = result.AccessToken;

但是,我遇到了一个例外:

AADSTS500011:在名为 MY-TENANT 的租户中找不到名为 api://my-resource/.default 的资源主体。

我完全不知道如何在 .NET 4.8 中获取 OAuth 连接的令牌。

任何有关此的见解都将受到高度赞赏。

c# oauth-2.0 .net-4.8
1个回答
0
投票

我找到了解决方案,以防其他人遇到类似问题:

我所做的就是替换这一行:

var scope = "api://my-resource/.default";

有了这个

var scope = "my-resource/.default";

现在可以完美运行了。

我希望这对将来的人有帮助。 祝你玩得愉快。

© www.soinside.com 2019 - 2024. All rights reserved.