Azure AD Auth、Angular 和 .NET API 与图形:MSAL.UiRequiredException 修复了吗?

问题描述 投票:0回答:1

我面临以下情况:我在 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

angular azure-active-directory office365 asp.net-core-webapi azure-ad-msal
1个回答
0
投票

我们现在决定通过管理员对所有用户进行授权,这缩短了流程。随后,该应用程序能够根据登录用户打开 Outlook。

© www.soinside.com 2019 - 2024. All rights reserved.