private async Task RefreshServiceMapAsync()

in src/CsrValidation/csharp/ScepValidation/IntuneServiceLocationProvider.cs [195:261]


        private async Task RefreshServiceMapAsync()
        {
            string token = string.Empty;
            string graphRequest = $"{this.msalGraphResourceUrl}v{this.msGraphApiVersion}/servicePrincipals/appId={this.intuneAppId}/endpoints";
            bool msalFailed = false;
            try
            {
                token = await this.msalClient.AcquireTokenAsync(new string[] { this.msalGraphResourceUrl + ".default" });
            }
            catch { msalFailed = true; }

            if (msalFailed)
            {
                token = await this.adalClient.AcquireTokenAsync(this.aadGraphResourceUrl);
                graphRequest = this.aadGraphResourceUrl + tenant + "/servicePrincipalsByAppId/" + this.intuneAppId + "/serviceEndpoints?api-version=" + this.aadGraphApiVersion;
            }


            Guid activityId = Guid.NewGuid();

            IHttpClient client = this.httpClient;
            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            client.DefaultRequestHeaders.Add("client-request-id", activityId.ToString());

            HttpResponseMessage response = null;
            string result = null;
            try
            {
                response = await client.GetAsync(graphRequest);
                result = await response.Content.ReadAsStringAsync();
                response.EnsureSuccessStatusCode();
            }
            catch (HttpRequestException e)
            {
                trace.TraceEvent(TraceEventType.Error, 0, $"Failed to contact intune service with URL: {graphRequest};\r\n{e.Message}");
                trace.TraceEvent(TraceEventType.Error, 0, result);
                throw;
            }

            JObject jsonResponse;
            try
            {
                jsonResponse = JObject.Parse(result);
            }
            catch (JsonReaderException e)
            {
                throw new IntuneClientException($"Failed to parse JSON response during Service Discovery from Graph. Response {result}", e);
            }

            JToken serviceEndpoints = null;
            if (jsonResponse.TryGetValue("value", out serviceEndpoints))
            {
                serviceMap.Clear(); // clear map now that we ideally have a good response

                foreach (var service in serviceEndpoints)
                {
                    var serviceName = service["providerName"] == null ? service["serviceName"] : service["providerName"];

                    serviceMap[serviceName.ToString().ToLowerInvariant()] = service["uri"].ToString();
                }
            }
            else
            {
                throw new IntuneClientException($"Failed to parse JSON response during Service Discovery from Graph. Response {jsonResponse.ToString()}");
            }
        }