0

在 Azure AD 企业应用程序方面,我似乎遗漏了一些基本的东西。
我有一个作为 Angular SPA 运行的应用程序,其后端 ASPNETCore API 在 Azure AD 中有 2 个单独的应用程序注册。MyAPI 在 MySPA 中作为范围“access_as_user”公开。
MyAPI 本身没有身份验证流程。

我想通过 MyAPI 实现委托访问 MS Graph API 调用。目前它仅作为具有应用程序权限的守护程序服务运行。

MySPA 可以毫无问题地调用https://graph.microsoft.com/v1.0/me/并返回配置文件。
我可以看到 jwt 具有 User.Read 范围:

"scp": "openid profile User.Read email"

MyAPI 使相同的请求失败,并出现以下错误:

code: "InvalidAuthenticationToken"
message: "Access token validation failure. Invalid audience."
public async Task<IActionResult> GetProfile([FromHeader] string authorization)
{
   var tokenFromHeader = authorization.Replace("Bearer ", "");
   return await ("https://graph.microsoft.com/v1.0/me/")
      .WithOAuthBearerToken(tokenFromHeader)
      .WithHeader("Content-Type", "application/json")
      .GetJsonAsync();
    }

JWT 自然有 scoped 权限,所以观众错误是有道理的

"aud": "api://XXXXXXXXXXXXXXXXXXXXXXXX",
"scp": "access_as_user"

MyAPI 如何代表用户访问 MS Graph API?

4

1 回答 1

0

设法使用 Graph SDK 解决了这个问题

我在启动后添加了以下内容.AddMicrosoftIdentityWebApi(Configuration)

.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph()
.AddInMemoryTokenCaches();

这允许我在我的 API 控制器中注入服务客户端:

public GraphAPIController(GraphServiceClient client)
{
   this.client = client;
}

public async Task<IActionResult> GetProfile()
{
   return await client.Me.Request().GetAsync();
}
于 2021-09-27T11:51:19.320 回答