public async Task <int> ServicePrincipals() { try { var appsPermissions = await GraphServiceHelper.GetAppsPermission(_graphClient, _httpContext); var principalsPermissions = await GraphServiceHelper.GetDirectoryAudits(_graphClient, _httpContext); var servicePrincipals = await GraphServiceHelper.GetServicePrincipals(_graphClient, _httpContext); var principalIdToPermissions = new Dictionary <string, HashSet <string> >(); principalsPermissions.ForEach(_ => { principalIdToPermissions.TryAdd( _.TargetResources.First().Id, ToHashSetExtension.ToHashSet(_.TargetResources.First().ModifiedProperties.First(__ => __.DisplayName == "ConsentAction.Permissions").NewValue.Split("Scope:").Last(). Split("]").First().Split(" ").Where(__ => __ != "")) ); }); var appIdToPermissionsSetDictionary = new Dictionary <string, HashSet <string> >(); appsPermissions.ForEach(_ => { var permissionsSet = ToHashSetExtension.ToHashSet(Newtonsoft.Json.Linq.Extensions.Value <string>(_["scope"]) .Split(' ')); var appId = Newtonsoft.Json.Linq.Extensions.Value <string>(_["clientId"]); appIdToPermissionsSetDictionary.TryAdd(appId, permissionsSet); }); var appIdToNameDictionary = new Dictionary <string, Tuple <string, string, string, string> >(); servicePrincipals.ForEach(_ => appIdToNameDictionary.Add( Newtonsoft.Json.Linq.Extensions.Value <string>(_["id"]), new Tuple <string, string, string, string>( Newtonsoft.Json.Linq.Extensions.Value <string>(_["appId"]), Newtonsoft.Json.Linq.Extensions.Value <string>(_["displayName"]), Newtonsoft.Json.Linq.Extensions.Value <string>(_["homepage"]), Newtonsoft.Json.Linq.Extensions.Value <string>(_["appOwnerOrganizationId"]) ))); appIdToNameDictionary.ForEach(_ => { appIdToPermissionsSetDictionary.TryGetValue(_.Key, out var appPermissions); principalIdToPermissions.TryGetValue(_.Key, out var principalPermissions); if (Startup.IsCosmosDbGraphEnabled && (principalPermissions != null || appPermissions != null)) { if (principalPermissions != null) { CosmosDbGraphHelper.Applications(_.Value.Item2, _.Value.Item1, principalPermissions, UserIds, _.Key, _.Value.Item3, _.Value.Item4); } else { CosmosDbGraphHelper.Applications(_.Value.Item2, _.Key, appPermissions, UserIds, _.Value.Item1, _.Value.Item3, _.Value.Item4); } } }); return(appIdToNameDictionary.Count); } catch (Exception ex) { _logger.Error(ex, $"{nameof(ServicePrincipals)} {ex.Message} {ex.InnerException}"); } return(0); }