Azure AD 身份验证 401 错误“受众无效” AddAzureADBearer .Net Core Web Api

pre*_*elb 11 authentication jquery azure-active-directory azure-ad-msal asp.net-core-webapi

我正在尝试使用此示例创建一个简单的 Azure AD 身份验证示例,但我的客户端是 JQuery。我不知道为什么当令牌显示观众是https://myportal.onmicrosoft.com/test_core_web_api_spa. 这与 Azure 中的 API 定义相匹配。唯一缺少的部分是自定义范围,user_impersonation但是当我使用 MSALclientApplication.acquireTokenSilent(tokenRequest2)进行调用以获取令牌时,我的范围与具有范围的 API 的完整 URL 匹配:

const tokenRequest2 = {
    scopes: ["https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation"]
};
Run Code Online (Sandbox Code Playgroud)

在建立身份验证的 API 中,我正在使用此代码(我注意到使用此方法的示例并不多)

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
   .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
Run Code Online (Sandbox Code Playgroud)

API的配置是

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "myportal.onmicrosoft.com",
    "TenantId": "my-tenant-guid",
    "ClientId": "my-api-client-guid"
  },
Run Code Online (Sandbox Code Playgroud)

我注意到许多示例显示了不同的 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列出了我附加到我的范围请求的范围。我只是看不出还有什么可尝试的。

在此处输入图片说明

公开 web api 的 api 设置

pre*_*elb 23

问题在于 Web API 的配置数据。当他们说ClientId他们真正想要的是“公开 API”选项下的值时,它显示“应用程序 ID URI”。我在那里放的是 Web Api 应用程序注册的 guid。下面是它的外观。

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "myportal.onmicrosoft.com",
    "TenantId": "mytenant-guid",
    "ClientId": "https://myportal.onmicrosoft.com/test_core_web_api_spa"
  },
Run Code Online (Sandbox Code Playgroud)

注意 API 格式。 看起来,当您直接在 Azure 中注册应用程序时,公开的 API 的格式将为api://app-guid. 但是,如果您首先使用 Visual Studio 创建应用程序,则格式将默认为类似https:///myportal.onmicrosoft.com/project-name-in-visual-studio.

  • 如果我可以投票一百万次,我会的。我浪费了整整两天的时间试图解决这个问题。极其不负责任的属性命名和糟糕的文档。 (5认同)

Jon*_*rds 5

像这里的大多数人一样,我在这个问题上停留了一段时间,文档严重让人失望。

在遵循 MS 指南的同时,它会像这样在服务器项目中填充 appsettings 文件

"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
 }
Run Code Online (Sandbox Code Playgroud)

令人沮丧的是,此修复非常简单,只需使用 api:// 预先修复客户端 ID,以便它与 JWT 中的受众以及 AAD 中服务器应用程序的“公开 API”部分上的应用程序 ID URI 相匹配

"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "api://41451fa7-82d9-4673-8fa5-69eff5a761fd",
} 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述