c# - 为什么 Graph API 无法正确提供 AAD 用户上次事件

标签 c# azure asp.net-core microsoft-graph-api

我正在使用 Graph api 获取 AAD 用户列表

        internal static async Task<List<Users>> GetUsers()
        {
            List<Users> uList = new List<Users>();
            try
            {
                IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
               .Create(AppId)
               .WithTenantId(TenantId)
               .WithClientSecret(ClientSecret)
               .Build();

                ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

                GraphServiceClient graphClient = new GraphServiceClient(authProvider);
                graphClient.BaseUrl = Constant.BaseUrl;

                var result = await graphClient.Users
                    .Request()
                    .Select("Id,Mail,signInActivity")
                    .GetAsync();
                while (true)
                {
                    foreach (var item in result.CurrentPage)
                    {
                        var user = new Users
                        {
                            Id = item.Id,
                            EmailId = item.Mail,                            
                            AdditionalData = item.AdditionalData,
                            User = item
                        };
                        var lastActivityDictonery = item.AdditionalData;
                        var arr = ToStringArray(lastActivityDictonery["signInActivity"]);

                        var parsedJson = JObject.Parse(arr[0]);
                        var lastSignInDateTime = Convert.ToString(parsedJson["lastSignInDateTime"]);
                        var lastNonInteractiveSignInDateTime = Convert.ToString(parsedJson["lastNonInteractiveSignInDateTime"]);
                        user.LastLoginDate = lastSignInDateTime;
                        user.lastNonInteractiveLogInDate = lastNonInteractiveSignInDateTime;
                        
                        uList.Add(user);
                    }

                    if (result.NextPageRequest is null)
                        break;

                    result = await result
                      .NextPageRequest
                      .GetAsync()
                      .ConfigureAwait(false);
                }
            }
            catch (Exception ex)
            {
                log.LogError(ex.ToString());
            }

            return _userList;
        }

        static string[] ToStringArray(object arg)
        {
            var collection = arg as System.Collections.IEnumerable;
            if (collection != null)
            {
                return collection
                  .Cast<object>()
                  .Select(x => x.ToString())
                  .ToArray();
            }

            if (arg == null)
            {
                return new string[] { };
            }

            return new string[] { arg.ToString() };
        }


为了查找最新的登录日期,我利用了从图形 API 获取的 AdditionalData 字典结果。但我得到的数据并不完整。对于同一用户,有时我会得到结果,有时不会,有时最后登录日期也会发生变化,即使它是过去的日期。

示例: 我调用此方法,对于 X 用户,我将 2022 年 12 月 1 日作为最后登录日期,但第二天如果我再次检查,那么对于同一个 X 用户,它显示 2023 年 2 月 2 日,认为这两个日期都已过去。

我没有门户访问权限来验证它,所以我有点困惑。我在这个过程中做错了什么吗?

Note: I'm using Beta graph API URL

最佳答案

根据您的描述,恐怕您应该使用用户属性中的 signInActivity 来获取最后登录时间。

请注意此属性需要 AuditLog.Read.All 权限Azure AD Premium P1/P2 许可证

顺便说一句,我没有找到解释或提及包含用户登录信息的 AdditionalData 的文档。因此,我认为这不是在此属性中获取登录信息的好方法。

enter image description here

关于c# - 为什么 Graph API 无法正确提供 AAD 用户上次事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75977440/

相关文章:

c# - nhibernate 无法使用 LeftOuterJoin 解析属性(仅在 Visual Studio 2015 中)

azure - 当他们从azure redis缓存中清除时,Hangfire完成了工作?

asp.net-core - 使用 ssl 在 IIS 中部署内部 asp.net 项目

asp.net-core - IdentityServer 4 多个外部 Active Directory 提供商

c# - .NET Core 从 Startup.cs 重定向到自定义错误页面

c# - Razor 页面链接忽略路由参数

c# - 如何在 ASP.NET Core 中以编程方式检查用户是否处于某个角色?

c# - 为这个问题选择正确的数据结构 : circular linked list, 列表、数组或其他

azure - 是否可以向 azure 数据工厂管道中的数据添加具有特定值的列

Azure 安全 MFA 电话调用设置