【发布时间】:2021-11-28 14:28:51
【问题描述】:
我有一个想要使用 Azure AD 保护的 .net core 5 api,然后从控制台应用程序调用它。所以我的案例只是服务到服务的身份验证。我将这两个应用程序都注册到了 Azure AD,然后使用应用程序角色授予了 api 上的控制台应用程序的权限。 我成功地为控制台应用程序检索了一个令牌,通过了正确的范围:
static async Task Main(string[] args)
{
var app = ConfidentialClientApplicationBuilder
.Create(<MY_CONSOLE_APP_ID>)
.WithClientSecret(<MY_CONSOLE_APP_CLIENT_SECRET>)
.WithAuthority(new Uri($"https://login.microsoftonline.com/<MY_TENANT_ID>"))
.Build();
var result = await app.AcquireTokenForClient(new String[]
{
"api://<MY_API_APP_ID>/.default"
})
.ExecuteAsync();
}
然后在 API 的 Startup 类中,我添加了以下代码:
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd");
我在 appsettings.json 中定义了所需的设置:
"AzureAd": {
"ClientId": "<MY_API_APP_ID>",
"Instance": "https://login.microsoftonline.com/",
"TenantId": "<MY_TENANT_ID>"
}
然后我将控制器标记为 [Authorize],但是当我调用其端点之一时,我收到以下错误:
{
"code": 401,
"message": "IDX10214: Audience validation failed. Audiences: '[PII is hidden]'. Did not match: validationParameters.ValidAudience: '[PII is hidden]' or validationParameters.ValidAudiences: '[PII is hidden]'."
}
我也尝试用 api:// 作为 clientId 的前缀,但得到了同样的错误。我对令牌进行了解码以确保观众是正确的,而且看起来没问题,因为我有 "aud": "api://
你知道我错过了什么吗?
【问题讨论】:
标签: azure azure-active-directory azure-ad-graph-api azure-authentication