public async Task <IActionResult> Index(UserLogin userLogin)
        {
            ViewBag.ErrorMessage = "User login details not found.";
            if (!userLogin.Exists())
            {
                return(View());
            }

            try
            {
                if (!Configuration.Application.AutoLogin)
                {
                    // check username config
                    ViewBag.ErrorMessage = "Username config missing";
                    if (!UsernameOk())
                    {
                        return(View());
                    }

                    // check password config
                    ViewBag.ErrorMessage = "Password config missing";
                    if (!PasswordOk())
                    {
                        return(View());
                    }

                    // check username provided
                    ViewBag.ErrorMessage = "Please enter Username";
                    if (string.IsNullOrWhiteSpace(userLogin.UserName))
                    {
                        return(View());
                    }

                    // check password provided
                    ViewBag.ErrorMessage = "Please enter Password";
                    if (string.IsNullOrWhiteSpace(userLogin.Password))
                    {
                        return(View());
                    }

                    // check password match
                    ViewBag.ErrorMessage = "Invalid Password entered";
                    if (!userLogin.Password.Equals(Configuration.Application.Password))
                    {
                        return(View());
                    }

                    // check Azure AD membership
                    ViewBag.ErrorMessage = "Invalid Username entered";
                    if (!userLogin.UserName.Equals(Configuration.Application.Username))
                    {
                        return(View());
                    }
                }
                else
                {
                    userLogin.UserName = "******";
                }

                // start building user claims
                var claims = new List <Claim>
                {
                    new Claim(ClaimTypes.Name, userLogin.UserName)
                };

                // check Azure
                if (AzureClientOk())
                {
                    var azureAccessToken = await AcquireAzureAccessToken();

                    if (!string.IsNullOrWhiteSpace(azureAccessToken))
                    {
                        var subscriptions = await _portalService.GetSubscriptions(azureAccessToken);

                        if (subscriptions.Result.value.Count > 0)
                        {
                            // check ACR
                            var acrs = await _acrService.GetAcrs(
                                subscriptions.Result.value.Select(s => s.subscriptionId).ToList(),
                                azureAccessToken);

                            if (acrs.Result.Values.Count > 0 && acrs.Result.Values.First().value.Count > 0)
                            {
                                var acrServer = acrs.Result.Values.First().value.First().properties.loginServer;
                                if (!string.IsNullOrWhiteSpace(acrServer))
                                {
                                    var acrAccessToken = await AcquireAcrAccessToken(
                                        Constants.Scopes.Push,
                                        acrServer,
                                        azureAccessToken);

                                    if (!string.IsNullOrWhiteSpace(acrAccessToken))
                                    {
                                        var imageScope = await _dockerService.CheckScope(acrServer, acrAccessToken);

                                        var chartScope = await _helmService.CheckScope(acrServer, acrAccessToken);

                                        if (imageScope.StatusCode.Equals(HttpStatusCode.Unauthorized) &&
                                            chartScope.StatusCode.Equals(HttpStatusCode.Unauthorized))
                                        {
                                            acrAccessToken = await AcquireAcrAccessToken(
                                                Constants.Scopes.Pull,
                                                acrServer,
                                                azureAccessToken);

                                            if (!string.IsNullOrWhiteSpace(acrAccessToken))
                                            {
                                                claims.Add(new Claim(ClaimTypes.Role, Constants.Roles.AcrReader));
                                                claims.Add(new Claim(Constants.Uri.AcrUri, acrServer));
                                                claims.Add(new Claim(Constants.AccessTokens.AcrAccessToken,
                                                                     acrAccessToken));
                                            }
                                        }
                                        else
                                        {
                                            claims.Add(new Claim(ClaimTypes.Role, Constants.Roles.AcrContributor));
                                            claims.Add(new Claim(Constants.Uri.AcrUri, acrServer));
                                            claims.Add(new Claim(Constants.AccessTokens.AcrAccessToken,
                                                                 acrAccessToken));
                                        }
                                    }
                                }
                            }

                            // check AKS
                            var aksScope = await _aksService.GetClustersWithAccessToken(
                                subscriptions.Result.value.Select(s => s.subscriptionId).ToList(),
                                azureAccessToken);

                            var hasAccessToAks = false;
                            foreach (var subs in aksScope.Result.Values)
                            {
                                if (subs.value.Count > 0)
                                {
                                    hasAccessToAks = true;
                                }
                            }
                            if (hasAccessToAks)
                            {
                                claims.Add(new Claim(ClaimTypes.Role, Constants.Roles.AksReader));
                                claims.Add(new Claim(Constants.AccessTokens.AzureAccessToken, azureAccessToken));
                            }
                        }
                    }
                }

                // check DevOps
                //if (AzureDevOpsOk())
                //{
                //    var hasDevopsAccess = await _projectService.CheckAccess(
                //        Configuration.DevOps.Projects.Split('|').ToList(),
                //        Configuration.DevOps.Organisation,
                //        Configuration.DevOps.PatToken);
                //    if (hasDevopsAccess.Result)
                //    {

                //        var build = await _buildService.Get("4.72.19023",
                //            Configuration.DevOps.Projects.Split('|').ToList(),
                //            Configuration.DevOps.Organisation,
                //            Configuration.DevOps.PatToken);

                //        claims.Add(new Claim(ClaimTypes.Role, Constants.Roles.DevOpsReader));
                //        claims.Add(new Claim(Constants.AccessTokens.DevOpsAccessToken, Configuration.DevOps.PatToken));
                //    }
                //}

                // create user principal
                ViewBag.ErrorMessage = null;

                var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(
                                                            claims, CookieAuthenticationDefaults.AuthenticationScheme));

                await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    userPrincipal,
                    new AuthenticationProperties
                {
                    ExpiresUtc   = DateTime.UtcNow.AddHours(1),
                    IsPersistent = false,
                    AllowRefresh = false
                });

                return(RedirectToAction("Index", "Home"));
            }
            catch
            {
                ViewBag.ErrorMessage = "Error ocurred during login process! Please try again later...";
                return(View());
            }
        }