如何为中间层生成代币 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 令牌。
它的工作方式应该是:
- Web 应用程序使用授权代码流
获取 Web 的访问令牌API
- Web API 接收访问令牌并使用 on-behalf-of 流
将其交换为 MS Graph API 令牌
- 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.
我正在尝试使用 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 令牌。
它的工作方式应该是:
- Web 应用程序使用授权代码流 获取 Web 的访问令牌API
- Web API 接收访问令牌并使用 on-behalf-of 流 将其交换为 MS Graph API 令牌
- 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.