我们代表用户调用 Azure 中的许多 ASPNET Core Web API。该用户通常已登录到同样在 Azure 中的 ASPNET 网站。
我们正在引入审计服务。感觉应该代表调用服务而不是经过身份验证的用户调用它。
- 审计服务在 Azure AD 中有关联的应用注册
- 审计服务有一个名为“access_as_application”的范围,虽然看过有关“.default”范围的文档,但我不确定我是否需要一个范围
- 调用应用程序(ASPNET Core 网站)已添加到前面提到的范围的“授权客户端应用程序”部分
在调用应用程序中,我通过使用获取应用程序而不是用户的访问令牌 GetAccessTokenForAppAsync
。
var accessToken = await this.tokenAcquisition.GetAccessTokenForAppAsync(this.auditApiScope);
System.Diagnostics.Debug.WriteLine($"access token-{accessToken}");
this.httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
this.httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
目前我正在本地开发机器上运行调用应用程序和审计服务。
当我打电话给审计服务时,我收到了 401 Unauthorized
var response = await this.httpClient.PostAsync($"{this.auditApiBaseAddress}v1/entries", requestContent);
更新
我已通过 App Manifest 将调用应用程序的 Azure Ad App Id 添加为审计服务上的 knownClientApplication。这并没有阻止 401
"knownClientApplications": [
"7ac7f49d-e9fa-4e1b-95b2-03e0e1981f58"
],
更新 2
我可以看到在 Visual Studio 中运行的服务实例正在报告堆栈跟踪。它指的是 IDW10201 问题。
System.UnauthorizedAccessException: IDW10201: Neither scope or roles claim was found in the bearer token.
at Microsoft.Identity.Web.MicrosoftIdentityWebApiAuthenticationBuilderExtensions.<>c__DisplayClass3_1.<<AddMicrosoftIdentityWebApiImplementation>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.Identity.Web.MicrosoftIdentityWebApiAuthenticationBuilder.<>c__DisplayClass14_0.<<CallsWebApiImplementation>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
有什么想法为什么?