我有几个 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 连接的令牌。
任何有关此的见解都将受到高度赞赏。
我找到了解决方案,以防其他人遇到类似问题:
我所做的就是替换这一行:
var scope = "api://my-resource/.default";
有了这个
var scope = "my-resource/.default";
现在可以完美运行了。
我希望这对将来的人有帮助。 祝你玩得愉快。