【问题标题】:Delete User from Azure AD B2C using Graph API right after it was created - ObjectNotFoundException在创建后立即使用 Graph API 从 Azure AD B2C 中删除用户 - ObjectNotFoundException
【发布时间】:2020-04-24 17:34:28
【问题描述】:

我正在使用自定义策略在 Azure AD B2C 中注册用户。 最后一步,在发布 JWT 之前,技术配置文件会执行以下操作:

<!-- Store the user in the AD -->
<ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" ContinueOnError="false" />
<!-- Sends the user information, including ObjectId to website to store locally-->
<ValidationTechnicalProfile ReferenceId="REST-SendUserInformation" ContinueOnError="false"/>

所以,这很好用。但是,在我的代码中,如果步骤 2 中出现问题(将用户信息发送到本地存储),我会调用 Graph API 来删除刚刚创建的用户。 但是,我注意到 Graph API 在我“调试”时工作(这意味着需要一些时间单击下一步..下一步...),但是当它在服务器中运行时,用户不会从 AD 中删除。 它不会抛出异常。

我删除用户的代码如下:

        public AzureGraphService(IConfiguration configuration)
        {
            var azureOptions = new AzureAdOptions();
            configuration.Bind("AzureAdB2C", azureOptions);

            // Client credential provider is used by services and desktop applications to acquire Microsoft Graph access token without a user.
            _confidentialClientApplication = ConfidentialClientApplicationBuilder
                .Create(azureOptions.ClientId)
                .WithTenantId(azureOptions.Domain)
                .WithClientSecret(azureOptions.ClientSecret)
                .Build();

            ClientCredentialProvider authProvider = new ClientCredentialProvider(_confidentialClientApplication);

            // Set up the Microsoft Graph service client with client credentials
            _graphClient = new GraphServiceClient(authProvider);
        }

        public async Task DeleteUserFromAD(string azuresubid)
        {
            try
            {
                // Delete user by object ID
                await _graphClient.Users[azuresubid]
                   .Request()
                   .DeleteAsync();          
            }
            catch (Exception ex)
            {
                // TODO - Log exception?
                throw ex;
            }
        }

在 Azure AD B2C 中查看审核日志后,我发现了这个 “ObjectNotFoundException”。

但是,我确定对象是正确的,并且我用来删除的 objectID 也是正确的,因为如果我“调试”(慢慢地)它就可以工作。

我的问题是: 在 AD B2C 中创建对象(用户)与我可以从那里实际查看和删除对象的时间之间是否存在延迟?

谢谢

【问题讨论】:

  • 从你的描述看来,直接运行程序的时候,这个用户并没有创建成功。但是当你调试时(慢慢做),它已经创建成功了。因此可以删除。能否在代码中设置时间间隔进行测试?
  • 您好!用户确实是在 AD 中创建的,我什至在注册期间从 azure 获取 objectID 以存储在数据库中,同时调用我的 REST api,如果出现问题,可能会删除用户。我尝试添加 5s 的延迟,但仍然没有从 AD 中删除用户,并且出现相同的 objectNotFound 异常,这没有任何意义,因为当我看到审计日志和异常时,“目标”是正确的 objectID。
  • 你是怎么调用DeleteUserFromAD方法的?你能用DeleteUserFromAD方法打印azuresubid吗?
  • @TonyJu 我在另一个方法中调用此方法,只需调用该方法并传递 objectId await _azureGraphService.DeleteUserFromAD(objectId);
  • @HenriqueBelotto 你能得到DeleteUserFromAD 方法中的objectId吗?

标签: azure-active-directory microsoft-graph-api azure-ad-b2c


【解决方案1】:

存在延迟,策略执行针对相同的 DC,您从 REST API 调用的图形 api 调用可能会访问不同的 DC,并且当时无法找到该帐户。使用重试逻辑,尝试 3 次,延迟 5 秒。通常复制在 7 秒内完成。

【讨论】:

  • 谢谢!!它起作用了,我添加了一个 5 秒的重试逻辑。谢谢
猜你喜欢
  • 2019-08-10
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多