gpt4 book ai didi

azure - 代表 api(而非用户)从另一个 Web Api 获取 401 Unauthorized Calling Web Api

转载 作者:行者123 更新时间:2023-12-02 23:04:35 28 4
gpt4 key购买 nike

我们在 Azure 中有许多 ASPNET Core Web API,我们代表用户调用它们。该用户通常已登录到同样位于 Azure 中的 ASPNET 网站。

我们正在推出审计服务。感觉应该代表调用服务而不是经过身份验证的用户来调用它。

  • 审核服务在 Azure AD 中具有关联的应用注册
  • 审计服务有一个名为“access_as_application”的范围,尽管看过有关“.default”范围的文档,但我不确定我是否需要一个范围
  • 调用应用程序(ASPNET Core 网站)已添加到前面提到的范围的“授权客户端应用程序”部分

在调用应用程序中,我使用 GetAccessTokenForAppAsync 获取应用程序而不是用户的访问 token 。

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);

更新

我已通过应用程序 list 将调用应用程序的 Azure Ad 应用程序 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)

有什么想法吗?

最佳答案

您当前应该执行服务器到服务器的交互,即没有用户参与。因此,您的服务器应用程序需要创建一个appRole,然后将该应用程序角色作为应用程序权限授予客户端应用程序

首先需要暴露受Azure保护的服务器应用的api,可以按照以下流程进行配置:

Azure 门户>应用注册>公开 API>添加范围>添加客户端应用程序

enter image description here

然后,您需要创建服务器应用程序的 appRole,然后将该角色作为应用程序权限授予客户端应用程序。

enter image description here

接下来,转到客户端应用程序>API 权限>添加权限>我的 API>您的 API 应用程序。

enter image description here

最后,您需要使用 client credential flow 获取访问 token 没有用户登录的情况:

enter image description here

解析token:

enter image description here

关于azure - 代表 api(而非用户)从另一个 Web Api 获取 401 Unauthorized Calling Web Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67785209/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com