【发布时间】:2020-03-11 02:39:15
【问题描述】:
我正在尝试创建一个简单的 Azure AD 身份验证示例using this sample,但我的客户端是 JQuery。当令牌显示观众为https://myportal.onmicrosoft.com/test_core_web_api_spa 时,我不确定为什么会收到关于观众无效的 401 错误。这与 Azure 中的 API 定义相匹配。唯一缺少的部分是 user_impersonation 的自定义范围,但是当我使用 MSAL clientApplication.acquireTokenSilent(tokenRequest2) 进行调用以获取令牌时,我的范围与 API 的完整 URL 与范围匹配:
const tokenRequest2 = {
scopes: ["https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation"]
};
在建立身份验证的 API 中我正在使用此代码(我注意到使用此方法的示例并不多)
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
API 的配置是
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "myportal.onmicrosoft.com",
"TenantId": "my-tenant-guid",
"ClientId": "my-api-client-guid"
},
我注意到许多示例显示了 API 的不同格式(我假设这些是旧版本),但暴露的 API 范围在 Azure 中列为https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation。我还使用 Azure 仪表板添加了客户端的 guid,以访问这个公开的 API 范围。
任何想法我哪里出错了?或者,任何使用 MSAL、JQuery 客户端和简单的 .Net Core Web Api 的简单示例?似乎我发现的所有示例都已过时或使用不同的客户端或不同的身份验证方法。
更新以在 Azure 中为 web api 应用程序显示公开 api 设置。
我从 Azure 添加了一张图片,显示了“公开 api”屏幕的设置。我添加了自定义范围user_impersonation,然后添加了客户端并授予它对该范围的访问权限。如您所见,我的 Azure 订阅没有其他人看到的 api://guid 格式。当我尝试使用 api://guid 格式时,我收到错误 The resource principal named api://guid was not found in the tenant。
我还添加了令牌的图像。 aud 标记与我在 Azure 中的 Web api 应用程序名称相匹配。 scp 列出了我附加到我的范围请求的范围。我只是看不出还有什么可以尝试的。
【问题讨论】:
-
您应该检查的一件事是令牌中的 aud 声明是什么?是您的 API 应用 ID URI 还是 API 客户端 ID?
-
@juunas aud 声称令牌与 Azure 门户中公开的 API 匹配。我在第二句中列出了它,然后在结尾处引用了定义。
标签: jquery authentication azure-active-directory asp.net-core-webapi msal