我面临以下情况:我在 Azure AD 中有两个应用程序注册 - 一个 Angular 17 Web 应用程序和一个带有 .NET 6 的 REST API。我已通过 Azure AD 设置了身份验证/授权。 Angular 应用程序通过 MSAL 使用访问令牌调用 API,一切都按预期运行。
最近,我使用 Graph 客户端扩展了我的 API,以起草 Outlook 电子邮件并返回 Angular 可用于打开 Outlook 并显示电子邮件的链接。
用户可以查看、手动调整并发送电子邮件。为此,我在 Azure 中使用“Mail.ReadWrite”范围扩展了我的 API 应用程序注册,并在 C# 中实现了它,如下所示:
string clientId = _configuration["AzureAd:ClientId"];
string clientSecret = _configuration["AzureAd:ClientSecret"];
string tenantId = _configuration["AzureAd:TenantId"];
string[] scopes = { "Mail.ReadWrite" };
var options = new OnBehalfOfCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud };
var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, userAccessToken, options);
var graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);
var requestBody = new Message
{
Subject = $"Test",
Body = new ItemBody
{
ContentType = BodyType.Html,
Content = "Sehr geehrte Damen und Herren,<br/><br/>" +
"Test"
},
ToRecipients = new List<Recipient>
{
new() { EmailAddress = new EmailAddress { Address = sendDocumentsRequest.Receiver } }
},
From = new Recipient { EmailAddress = new EmailAddress { Address = sendDocumentsRequest.Sender } }
};
// 1. Step: Create E-Mail in drafts folder
var resultMessage = await graphClient.Me.Messages.PostAsync(requestBody);
这对我来说非常有效。
但是,所有其他用户都会收到以下错误消息:
2024-03-20 08:28:50.578 +01:00 [ERR] 处理时出错 会话 ID XXXXX 中的文档 Azure.Identity.AuthenticationFailedException:OnBehalfOfCredential 身份验证失败:AADSTS65001:用户或管理员尚未 同意使用 ID 为“XXXXXX”且名为“API_DEV”的应用程序。 发送此用户和资源的交互式授权请求。 ---> MSAL.NetCore.4.59.0.0.MsalUiRequiredException:错误代码:invalid_grant Microsoft.Identity.Client.MsalUiRequiredException: AADSTS65001:用户或管理员尚未同意使用 ID 为“XXXX”、名为“XXXX”的应用程序。发送互动 对此用户和资源的授权请求。 Microsoft.Identity.Client.Internal.Requests.RequestBase.HandleTokenRefreshErrorAsync(MsalServiceException e、MsalAccessTokenCacheItem (cachedAccessTokenItem) 处 Microsoft.Identity.Client.Internal.Requests.OnBehalfOfRequest.ExecuteAsync(CancellationToken 取消令牌)位于 Microsoft.Identity.Client.Internal.Requests.RequestBase.RunAsync(CancellationToken 取消令牌)位于 Microsoft.Identity.Client.ApiConfig.Executors.ConfidentialClientExecutor.ExecuteAsync(AcquireTokenCommonParameters commonParameters、AcquireTokenOnBehalfOfParameters onBehalfOfParameters、CancellationToken 取消令牌) Azure.Identity.AbstractAcquireTokenParameterBuilderExtensions.ExecuteAsync[T](AbstractAcquireTokenParameterBuilder`1 构建器、布尔异步、CancellationToken 取消令牌)位于 Azure.Identity.MsalConfidentialClient.AcquireTokenOnBehalfOfCoreAsync(字符串[] 范围、字符串tenantId、UserAssertion userAssertionValue、布尔值 enableCae、布尔异步、CancellationToken 取消令牌) Azure.Identity.MsalConfidentialClient.AcquireTokenOnBehalfOfAsync(字符串[] 范围、字符串tenantId、UserAssertion userAssertionValue、布尔值 enableCae、布尔异步、CancellationToken 取消令牌) Azure.Identity.OnBehalfOfCredential.GetTokenInternalAsync(TokenRequestContext requestContext、布尔异步、CancellationToken(取消令牌) 状态代码:400
他们没有得到同意提示。我不确定我是否已经在单元测试中确认了这一同意。使用该应用程序的用户被分配到与该应用程序关联的组。问题似乎出在 MSAL.NetCore.4.59.0.0.MsalUiRequiredException 上。我该如何以不同的方式对呼叫进行编程?我该如何解决这个问题?
=> AdminConsentRequired = 否 => Microsoft 文档 learn.microsoft.com/de-de/graph/permissions-reference