如何为中间层生成代币 API

How to generate an on-behalf-of token for a middle-tier API

我正在尝试使用 Microsoft Identity Platform 实现一个 on-behalf-of 流程,我的 Web 应用程序在其中对用户进行身份验证,然后向我的 Web API 发出请求,而后者又向Microsoft Graph API(和 returns Web 应用程序的结果)。

My problem is that I will need to pass on an on-behalf-of token to my Web API for it to be granted acces to Microsoft Graph, but I cannot manage to generate this token. (I'm trying to generate this token using Postman at the moment.)

我希望能够 运行 是官方文档 here 为 Microsoft Graph SDK(在 OBO 流的情况下)提供的代码片段,以及我需要帮助的是如何为 oboToken 变量生成令牌。

using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Identity.Client;

var scopes = new[] { "User.Read", "Presence.Read.All" };

var tenantId = "common";

var clientId = "<id of my API as registered in Azure AD / App Registrations>";
var clientSecret = "<value from Client Secret in Registerd Application / Certificates & secrets";

var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

var oboToken = "< WHAT NEEDS TO BE PROVIDED BY THE WEB APP >";

var cca = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

var authProvider = new DelegateAuthenticationProvider(async (request) => {
    var assertion = new UserAssertion(oboToken);
    var result = await cca.AcquireTokenOnBehalfOf(scopes, assertion).ExecuteAsync();

    request.Headers.Authorization =
        new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
});

var graphClient = new GraphServiceClient(authProvider);

Console.WriteLine(graphClient.Me.Request().GetAsync().Result);

我尝试了以下方法:我在浏览器中使用以下请求生成授权码

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
client_id=< Id of my API >
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp
&response_mode=query
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default

然后,使用返回的代码,发出以下 POST 请求(来自 Postman)

https://login.microsoftonline.com/common/oauth2/v2.0/token?
client_id=< Id of my API >
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp
&grant_type=authorization_code
&code=< code returned by request above >

当我使用响应中返回的标记作为代码片段中 oboToken 的值时,我得到了一个

MsalServiceException: AADSTS50027: JWT token is invalid or malformed.

如果我在上面的 POST 令牌请求中也包含一个 client_secret 参数,我会得到响应 AADSTS90023:Public 客户端无法发送客户端密钥.

How could I generate an on-behalf-of token to be able to run the provided code snippet?

提前致谢!

在我看来,您的错误是使用授权代码流获取 MS Graph API 令牌。

它的工作方式应该是:

  1. Web 应用程序使用授权代码流
  2. 获取 Web 的访问令牌API
  3. Web API 接收访问令牌并使用 on-behalf-of 流
  4. 将其交换为 MS Graph API 令牌
  5. Web API 调用 MS Graph API

因此,当您的 Web 应用程序获得访问令牌时,它应该使用 API 应用程序注册中定义的范围,而不是 scope=https%3A%2F%2Fgraph.microsoft.com%2F.default。 如果您指定 MS Graph API 范围,您将获得 MS Graph API 的访问令牌,这意味着您正在尝试从 Web 应用程序调用 MS Graph API,而不是您的 API.