コード例 #1
0
        public async Task <ActionResult> GetSecureDetails()
        {
            var startDateTime = DateTime.Now;

            try
            {
                var token = string.Empty;
                if (Request.Headers.ContainsKey("Authorization"))
                {
                    token = Request.Headers["Authorization"].ToString()?.Split(" ")?[1];
                }

                _graphService = _graphServiceProvider.GetService(token);

                var secureScores = _memoryCacheHelper.GetSecureScores("?$top=200");

                if (secureScores == null || secureScores?.ToList().Count() == 0)
                {
                    //// Get top secure score
                    secureScores = await _graphService.GetSecureScoresAsync("?$top=200");

                    _memoryCacheHelper.SetSecureScores("?$top=200", secureScores);
                }

                if (secureScores == null || secureScores?.ToList().Count == 0)
                {
                    return(NotFound());
                }

                var topSecureScore = secureScores.FirstOrDefault();

                var controlProfiles = _memoryCacheHelper.GetSecureScoreControlProfiles();

                if (controlProfiles == null || controlProfiles?.ToList().Count() == 0)
                {
                    //// Get top secure score
                    controlProfiles = await _graphService.GetSecureScoreControlProfilesAsync();

                    _memoryCacheHelper.SetSecureScoreControlProfiles(controlProfiles);
                }

                var restQueryBuilder = new StringBuilder();

                restQueryBuilder.Append($"<a href=\"https://developer.microsoft.com/en-us/graph/graph-explorer?request=security/securescores?$top=1&&method=GET&version=beta&GraphUrl=https://graph.microsoft.com\" target=\"_blank\">https://graph.microsoft.com/beta/security/securescores?$top=1</a>");

                var secureScoreDetails = new SecureScoreDetailsViewModel
                {
                    TopSecureScore = new SecureScoreModel
                    {
                        CreatedDateTime   = topSecureScore.CreatedDateTime,
                        CurrentScore      = topSecureScore.CurrentScore,
                        MaxScore          = topSecureScore.MaxScore,
                        EnabledServices   = topSecureScore.EnabledServices.Select(service => service.StartsWith("Has", StringComparison.CurrentCultureIgnoreCase) ? service.Substring(3) : service),
                        LicensedUserCount = topSecureScore.LicensedUserCount ?? 0,
                        ActiveUserCount   = topSecureScore.ActiveUserCount ?? 0,
                        Id            = topSecureScore.Id,
                        ControlScores = (topSecureScore.ControlScores?.Select(controlScore => new ControlScoreModel
                        {
                            ControlCategory = controlScore.ControlCategory,
                            Score = controlScore.Score ?? 0,
                            Name = controlScore.ControlName,
                            Description = controlScore.Description,
                            Count = controlScore.AdditionalData.ContainsKey("count")
                                ? controlScore.AdditionalData["count"].ToString()
                                : controlScore.AdditionalData.ContainsKey("on")
                                    ? controlScore.AdditionalData["on"].ToString()
                                    : "0",
                            Total = controlScore.AdditionalData.ContainsKey("total")
                                ? controlScore.AdditionalData["total"].ToString()
                                : controlScore.AdditionalData.ContainsKey("IntuneOn")
                                    ? controlScore.AdditionalData["IntuneOn"].ToString()
                                    : "0",
                        }) ?? Enumerable.Empty <ControlScoreModel>())
                                        .GroupBy(controlScoreModel => controlScoreModel.ControlCategory)
                                        .Select(groupControlScore => new ControlScoreModel
                        {
                            ControlCategory = groupControlScore.Key.ToString(),
                            Score           = groupControlScore.Sum(x => x.Score),
                            Description     = groupControlScore.FirstOrDefault().Description,
                            Name            = groupControlScore.FirstOrDefault().Name,
                            Count           = groupControlScore.Count().ToString(),

                            // it was in version 2
                            // Total = groupControlScore.Sum(x => x.Total.AsEnumerable().Any(ch => char.IsLetter(ch)) ? 0 : Convert.ToInt32(x.Total)).ToString(),

                            // it was in version 2
                            // Count = groupControlScore.Sum(x=> x.Count.AsEnumerable().Any(ch => char.IsLetter(ch)) ? 0 : Convert.ToInt32(x.Count)).ToString(),
                        }).ToList(),
                        AverageComparativeScores = topSecureScore.AverageComparativeScores?.Select(score =>
                        {
                            string Value = string.Empty;
                            switch (score.Basis)
                            {
                            case "Industry":
                                {
                                    if (score.AdditionalData.ContainsKey("industryName"))
                                    {
                                        Value = score.AdditionalData["industryName"].ToString();
                                    }
                                }
                                break;

                            case "SeatCategory":
                                {
                                    if (score.AdditionalData.ContainsKey("SeatLowerLimit") && score.AdditionalData.ContainsKey("SeatUpperLimit"))
                                    {
                                        Value = $"{score.AdditionalData["SeatLowerLimit"]} - {score.AdditionalData["SeatUpperLimit"]}";
                                    }
                                }
                                break;

                            default:
                                {
                                    Value = string.Join(", ", score.AdditionalData.Select(item => item.Value));
                                }
                                break;
                            }

                            return(new AverageComparativeScoreModel
                            {
                                ComparedBy = score.Basis,
                                // if null or negative AverageScore set 0.0
                                AverageScore = score.AverageScore.HasValue
                                    ? score.AverageScore.Value > 0
                                        ? score.AverageScore.Value
                                        : 0.0
                                    : 0.0,
                                Value = Value
                            });
                        }) ?? Enumerable.Empty <AverageComparativeScoreModel>()
                    },
                    SecureScoreControlProfiles = controlProfiles?.Select(profile => profile) ?? Enumerable.Empty <SecureScoreControlProfileModel>()
                };

                // Save queries to session
                var resultQueries = new ResultQueriesViewModel(null, restQueryBuilder.ToString());

                var response = new SecureScoreDetailsResponse(secureScoreDetails, resultQueries);

                var responseString = JsonConvert.SerializeObject(
                    response,
                    new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });

                Debug.WriteLine($"Secure Score Controller GetSecureDetails execution time: {DateTime.Now - startDateTime}");
                return(new JsonStringResult(responseString));
            }
            catch (Exception exception)
            {
                return(BadRequest(exception.Message));
            }
        }