private void RegisterAccount(NHibernate.ISession session, UserAccountEF user, string aggregatorGroupId)
        {
            switch (user.UserType)
            {
            case RegisterType.Contrator:
                ContractorUser cu = new ContractorUser();
                cu.AggGroupId     = aggregatorGroupId;
                cu.ContractStatus = (int)ContractStatusCodes.Signing;
                cu.UserId         = user.Id;
                session.SaveAsync(cu);
                Task t = _userManager.AddToRoleAsync(user, UserRoleTypes.Contractor);
                t.Wait();
                break;

            //case RegisterType.Supervisor:
            //    var role_add_result = await _userManager.AddToRoleAsync(user, UserRoleTypes.Supervisor);
            //    //_userManager.AddClaimAsync(user, new Claim())
            //    SupervisorUser supervisorUser = new SupervisorUserEF();
            //    supervisorUser.UserId = user.Id;
            //    await _accountContext.SupervisorUsers.AddAsync(supervisorUser);
            //    break;
            case RegisterType.Aggregator:
                Task ta = _userManager.AddToRoleAsync(user, UserRoleTypes.Aggregator);
                ta.Wait();
                //_userManager.AddClaimAsync(user, new Claim())
                AggregatorUser aggregatorUser = new AggregatorUser();
                aggregatorUser.AggGroupId = aggregatorGroupId;
                aggregatorUser.UserId     = user.Id;
                session.SaveAsync(aggregatorUser);
                break;
            }
        }
        ///// <summary>
        ///// 임시 사이트 추가
        ///// </summary>
        ///// <param name="model"></param>
        ///// <returns></returns>
        //[HttpPost, Route("registtemporarysite")]
        //[AllowAnonymous]
        ////[ValidateAntiForgeryToken]
        //public async Task<IActionResult> RegistTemporarySite([FromBody] RegisterSiteModel model)
        //{

        //    //model.Email = value["Email"].ToString();
        //    //model.Password = value["Password"].ToString();
        //    //model.ConfirmPassword = value["ConfirmPassword"].ToString();
        //    //model.Username
        //    if (ModelState.IsValid)
        //    {

        //        UserAccount contractor = await _userManager.FindByEmailAsync(model.ContractorEmail);
        //        if(contractor == null)
        //        {
        //            IdentityError error = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).ContractorNotFounded(model.ContractorEmail);
        //            IdentityResult _result = IdentityResult.Failed(error);
        //            return BadRequest(new { Result = _result });
        //        }
        //        ContractorUser cu = await _accountContext.ContractorUsers.FindAsync(contractor.Id);

        //        TemporaryContractorSite newSite = new TemporaryContractorSite();
        //        newSite.Address1 = model.Address1;
        //        newSite.Address2 = model.Address2;
        //        newSite.ContractUserId = contractor.Id;
        //        newSite.Latitude = model.Latitude;
        //        newSite.IsJeju = model.IsJejuSite;
        //        newSite.Longtidue = model.Longtidue;
        //        newSite.LawFirstCode = model.LawFirstCode;
        //        newSite.LawMiddleCode = model.LawMiddleCode;
        //        newSite.LawLastCode = model.LawLastCode;
        //        newSite.ServiceCode = model.ServiceCode;
        //        newSite.RegisterTimestamp = DateTime.Now;

        //        foreach (RegisterAssetModel asset in model.Assets)
        //        {
        //            string assetName = $"{asset.Type}{asset.Index}";
        //            TemporaryContractorAsset newAsset = new TemporaryContractorAsset();
        //            newAsset.AssetName = assetName;
        //            newAsset.AssetType = asset.Type;
        //            newAsset.CapacityKW = asset.CapacityMW;
        //            newAsset.ContractorSite = newSite;
        //            newAsset.UniqueId = Guid.NewGuid().ToString();
        //            await _accountContext.TemporaryContractorAssets.AddAsync(newAsset);
        //        }

        //        await _accountContext.TemporaryContractorSites.AddAsync(newSite);
        //        await _accountContext.SaveChangesAsync();
        //        //var user = new ReservedAssetLocation
        //        //{
        //        //    AccountId = model.AccountId,
        //        //    Address1 = model.Address1,
        //        //    Address2 = model.Address2,
        //        //    ControlOwner = model.ControlOwner,
        //        //    //SiteInformation = model.SiteInformation,
        //        //    RegisterTimestamp = DateTime.Now,
        //        //    LawFirstCode = model.LawFirstCode,
        //        //    LawMiddleCode = model.LawMiddleCode,
        //        //    LawLastCode = model.LawLastCode,
        //        //    ServiceCode = model.ServiceCode,
        //        //    Latitude = model.Latitude,
        //        //    Longtidue = model.Longtidue
        //        //};
        //        //accountContext.ReservedAssetLocations.Add(user);
        //        //await accountContext.SaveChangesAsync();
        //        return Ok();
        //    }

        //    // If we got this far, something failed, redisplay form
        //    return BadRequest();
        //}

        private UserAccountEF CreateUserAccount(AggregatorRegistModelBase model)
        {
            var user = new UserAccountEF
            {
                FirstName          = model.FirstName,
                LastName           = model.LastName,
                Email              = model.Email,
                UserName           = model.Email,
                CompanyName        = model.Company,
                NormalizedUserName = model.Email.ToUpper(),
                PhoneNumber        = model.PhoneNumber,
                Address            = model.Address,
                RegistDate         = DateTime.Now,
                Expire             = DateTime.Now.AddDays(14),
                UserType           = model.Type
            };

            return(user);
        }
        private UserAccountEF CreateUserAccount(RegisterViewModel model, RegisterType type)
        {
            var user = new UserAccountEF
            {
                FirstName          = model.FirstName,
                LastName           = model.LastName,
                Email              = model.Email,
                UserName           = model.Email,
                CompanyName        = model.Company,
                NormalizedUserName = model.Email.ToUpper(),
                PhoneNumber        = model.PhoneNumber,
                Address            = model.Address,
                RegistDate         = DateTime.Now,
                Expire             = DateTime.Now.AddDays(14),
                UserType           = type,
                RegistrationNumber = model.RegisterNumber
            };

            return(user);
        }
        private UserAccountEF CreateBasicAccount(BasicRegistModel model, RegisterType userType)
        {
            var user = new UserAccountEF
            {
                FirstName          = model.FirstName,
                LastName           = model.LastName,
                Email              = model.Email,
                UserName           = model.Email,
                CompanyName        = "파워이십일",
                NormalizedUserName = model.Email.ToUpper(),
                PhoneNumber        = model.PhoneNumber,
                Address            = "파워이십일",
                RegistDate         = DateTime.Now,
                Expire             = new DateTime(2100, 12, 31),
                UserType           = userType,
                RegistrationNumber = ""
            };

            return(user);
        }
        private UserAccountEF CreateSupervisorAccount(BasicRegistModel model)
        {
            var user = new UserAccountEF
            {
                FirstName          = model.FirstName,
                LastName           = model.LastName,
                Email              = model.Email,
                UserName           = model.Email,
                CompanyName        = "파워이십일",
                NormalizedUserName = model.Email.ToUpper(),
                PhoneNumber        = model.PhoneNumber,
                Address            = "대전광역시 유성과 관평동 1359번지 한신에스메카 609호",
                RegistDate         = DateTime.Now,
                Expire             = DateTime.Now.AddMonths(1),
                UserType           = RegisterType.Supervisor,
                RegistrationNumber = "",
                SignInConfirm      = true
            };

            return(user);
        }
        //[HttpPost, Route("login"), AllowAnonymous]
        ////public async Task<IActionResult> Login([FromBody]JObject jo)
        //public async Task<IActionResult> Login()
        //{
        //    Console.WriteLine("call login~. No Parameter");
        //    //foreach (string key in Response.Headers.Keys)
        //    //{
        //    //    Console.WriteLine($"{key} : {Response.Headers[key]}");
        //    //}
        //    //Response.Cookies.Append("babo", "you~");
        //    //if (jo == null)
        //    //    return NoContent();
        //    //return await ClaimsLogin(jo);
        //    return Ok();
        //}

        //private async Task<IActionResult> ClaimsLogin([FromBody]JObject jo)
        //{
        //    bool isUservalid = false;
        //    LoginViewModel user = JsonConvert.DeserializeObject<LoginViewModel>(jo.ToString());

        //    if (ModelState.IsValid && isUservalid)
        //    {
        //        var claims = new List<Claim>();

        //        claims.Add(new Claim(ClaimTypes.Name, user.Email));


        //        var identity = new ClaimsIdentity(
        //            claims, JwtBearerDefaults.AuthenticationScheme);

        //        var principal = new ClaimsPrincipal(identity);

        //        var props = new AuthenticationProperties();
        //        props.IsPersistent = user.RememberMe;

        //        HttpContext.SignInAsync(
        //            IdentityConstants.ApplicationScheme,
        //            principal, props).Wait();
        //        string token = JasonWebTokenManager.GenerateToken(user.Email);
        //        return Ok(new { Token = token });
        //    }
        //    else
        //    {
        //        return BadRequest();
        //    }
        //}

        private async Task <IActionResult> OldLogin([FromBody] LoginModel user)
        {
            //[FromBody]
            //JObject jo = null;
            if (ModelState.IsValid)
            {
                if (string.IsNullOrEmpty(user.Email) || string.IsNullOrEmpty(user.Password))
                {
                    Console.WriteLine("Invalid User");
                    return(BadRequest());
                }

                UserAccountEF account = await _userManager.FindByEmailAsync(user.Email);

                if (account == null)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).UserNotFound();
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }
                else if (account.SignInConfirm == false)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).SignInNotConfirm(user.Email);
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }

                Microsoft.AspNetCore.Identity.SignInResult signResult = await _signInManager.PasswordSignInAsync(user.Email, user.Password, true, false);

                if (signResult.Succeeded)
                {
                    var accountUser = await _userManager.FindByEmailAsync(user.Email);

                    IList <Claim> claims = await _userManager.GetClaimsAsync(accountUser);

                    claims.Add(new Claim(ClaimTypes.NameIdentifier, accountUser.Id));
                    claims.Add(new Claim(ClaimTypes.Name, accountUser.FirstName + accountUser.LastName));

                    string roleType = "";
                    string id       = "";
                    if (accountUser.UserType == RegisterType.Aggregator)
                    {
                        roleType = UserRoleTypes.Aggregator;
                        var agg = _accountContext.VwAggregatorusers.FirstOrDefault(x => x.UserId == accountUser.Id);
                        id = agg.AggGroupId;
                        claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, agg.AggGroupId));
                        //claims.Add(new Claim("", ))
                        claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Aggregator));
                        if (string.IsNullOrEmpty(agg.AggName) == false)
                        {
                            claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, agg.AggName));
                        }
                    }
                    else if (accountUser.UserType == RegisterType.Contrator)
                    {
                        var contractor = _accountContext.VwContractorusers.FirstOrDefault(x => x.UserId == accountUser.Id);
                        id = accountUser.Id;
                        claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, contractor.AggGroupId));
                        claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Contractor));
                        roleType = UserRoleTypes.Contractor;
                        if (string.IsNullOrEmpty(contractor.AggName) == false)
                        {
                            claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, contractor.AggName));
                        }
                    }
                    else if (accountUser.UserType == RegisterType.Supervisor)
                    {
                        claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Supervisor));
                        roleType = UserRoleTypes.Supervisor;
                    }

                    var siteids = ControlHelper.GetAvaliableRccCodes(_accountContext, roleType, id);

                    claims.Add(new Claim(SiteIdsByRccClaim, siteids));

                    string token = JasonWebTokenManager.GenerateToken(user.Email, claims);

                    string result = JasonWebTokenManager.ValidateToken(user.Email, token, ClaimTypes.NameIdentifier);

                    //if (string.IsNullOrEmpty(returnUrl) == false)
                    //{
                    //    Console.WriteLine("returnurl:" + returnUrl);
                    //    return Redirect(returnUrl);
                    //}
                    Console.WriteLine("Log-in Success: " + user.Email);
                    return(Ok(new { Result = signResult, Token = token, User = accountUser }));
                }
                else
                {
                    Console.WriteLine($"Login Failed");
                    //if (signResult.RequiresTwoFactor)
                    //{
                    //    return RedirectToAction("act", new { ReturnUrl = returnUrl, RememberMe = user.RememberMe });
                    //}
                    if (signResult.IsLockedOut)
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).UserLockoutEnabled();
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(BadRequest(new { Result = _result }));
                    }
                    else
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).PasswordMismatch();
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(BadRequest(new { Result = _result }));
                    }
                }
            }
            else
            {
                Console.WriteLine("Invalid LoginViewModel");
                return(Ok(StatusCodes.Status406NotAcceptable));
            }
        }
        private async Task <string> GenerateAccessTokenAsync(UserAccountEF userAccount)
        {
            var           accountUser = userAccount;
            IList <Claim> claims      = await _userManager.GetClaimsAsync(accountUser);

            claims.Add(new Claim(ClaimTypes.NameIdentifier, accountUser.Id));
            claims.Add(new Claim(ClaimTypes.Name, accountUser.FirstName + accountUser.LastName));

            string roleType = "";
            string id       = "";

            if (accountUser.UserType == RegisterType.Aggregator)
            {
                roleType = UserRoleTypes.Aggregator;
                var agg = _accountContext.VwAggregatorusers.FirstOrDefault(x => x.UserId == accountUser.Id);
                id = agg.AggGroupId;
                claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, agg.AggGroupId));
                //claims.Add(new Claim("", ))
                claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Aggregator));
                if (string.IsNullOrEmpty(agg.AggName) == false)
                {
                    claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, agg.AggName));
                }
            }
            else if (accountUser.UserType == RegisterType.Contrator)
            {
                var contractor = _accountContext.VwContractorusers.FirstOrDefault(x => x.UserId == accountUser.Id);
                id = accountUser.Id;
                claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, contractor.AggGroupId));
                claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Contractor));
                roleType = UserRoleTypes.Contractor;
                if (string.IsNullOrEmpty(contractor.AggName) == false)
                {
                    claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, contractor.AggName));
                }
            }
            else if (accountUser.UserType == RegisterType.Supervisor)
            {
                claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Supervisor));
                roleType = UserRoleTypes.Supervisor;
            }
            else if (accountUser.UserType == RegisterType.AccountManager)
            {
                claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.AccountManager));
            }
            else if (accountUser.UserType == RegisterType.Hubbub)
            {
                claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.HubbubUser));
            }

            bool IsPlatformUser =
                accountUser.UserType == RegisterType.Supervisor ||
                accountUser.UserType == RegisterType.Aggregator ||
                accountUser.UserType == RegisterType.Contrator;

            if (IsPlatformUser)
            {
                var siteids = ControlHelper.GetAvaliableRccCodes(_accountContext, roleType, id);
                claims.Add(new Claim(UserClaimTypes.SiteIdsByRccClaim, siteids));
            }

            string token = JasonWebTokenManager.GenerateToken(accountUser.Email, claims);

            return(token);
        }
        //[HttpPost, Route("login"), AllowAnonymous]
        ////public async Task<IActionResult> Login([FromBody]JObject jo)
        //public async Task<IActionResult> Login()
        //{
        //    Console.WriteLine("call login~. No Parameter");
        //    //foreach (string key in Response.Headers.Keys)
        //    //{
        //    //    Console.WriteLine($"{key} : {Response.Headers[key]}");
        //    //}
        //    //Response.Cookies.Append("babo", "you~");
        //    //if (jo == null)
        //    //    return NoContent();
        //    //return await ClaimsLogin(jo);
        //    return Ok();
        //}

        //private async Task<IActionResult> ClaimsLogin([FromBody]JObject jo)
        //{
        //    bool isUservalid = false;
        //    LoginViewModel user = JsonConvert.DeserializeObject<LoginViewModel>(jo.ToString());

        //    if (ModelState.IsValid && isUservalid)
        //    {
        //        var claims = new List<Claim>();

        //        claims.Add(new Claim(ClaimTypes.Name, user.Email));


        //        var identity = new ClaimsIdentity(
        //            claims, JwtBearerDefaults.AuthenticationScheme);

        //        var principal = new ClaimsPrincipal(identity);

        //        var props = new AuthenticationProperties();
        //        props.IsPersistent = user.RememberMe;

        //        HttpContext.SignInAsync(
        //            IdentityConstants.ApplicationScheme,
        //            principal, props).Wait();
        //        string token = JasonWebTokenManager.GenerateToken(user.Email);
        //        return Ok(new { Token = token });
        //    }
        //    else
        //    {
        //        return BadRequest();
        //    }
        //}

        private async Task <IActionResult> OldLogin([FromBody] LoginModel user)
        {
            //[FromBody]
            //JObject jo = null;
            if (ModelState.IsValid)
            {
                if (string.IsNullOrEmpty(user.Email) || string.IsNullOrEmpty(user.Password))
                {
                    Console.WriteLine("Invalid User");
                    return(BadRequest());
                }

                UserAccountEF account = await _userManager.FindByEmailAsync(user.Email);

                if (account == null)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).UserNotFound();
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }
                else if (account.SignInConfirm == false)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).SignInNotConfirm(user.Email);
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }
                else if (account.Expire <= DateTime.Now)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).Expired();
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }

                Microsoft.AspNetCore.Identity.SignInResult signResult = await _signInManager.PasswordSignInAsync(user.Email, user.Password, true, false);

                if (signResult.Succeeded)
                {
                    var accountUser = await _userManager.FindByEmailAsync(user.Email);

                    string token = await GenerateAccessTokenAsync(accountUser);

                    string result       = JasonWebTokenManager.ValidateToken(user.Email, token, ClaimTypes.NameIdentifier);
                    string refreshToken = null;



                    if (distributedCache.TryGetValue(user.Email, out refreshToken) == false)
                    {
                        refreshToken = JasonWebTokenManager.GenerateRefreshToken(user.Email);
                        var cacheEntryOptions = new MemoryCacheEntryOptions()
                                                .SetSlidingExpiration(TimeSpan.FromDays(100));
                        distributedCache.Set(user.Email, refreshToken, cacheEntryOptions);
                    }
                    //if (string.IsNullOrEmpty(returnUrl) == false)
                    //{
                    //    Console.WriteLine("returnurl:" + returnUrl);
                    //    return Redirect(returnUrl);
                    //}
                    Console.WriteLine("Log-in Success: " + user.Email);
                    return(Ok(new { Result = signResult, Token = token, RefreshToken = refreshToken, User = accountUser }));
                }
                else
                {
                    Console.WriteLine($"Login Failed");
                    //if (signResult.RequiresTwoFactor)
                    //{
                    //    return RedirectToAction("act", new { ReturnUrl = returnUrl, RememberMe = user.RememberMe });
                    //}
                    if (signResult.IsLockedOut)
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).UserLockoutEnabled();
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(BadRequest(new { Result = _result }));
                    }
                    else
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).PasswordMismatch();
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(BadRequest(new { Result = _result }));
                    }
                }
            }
            else
            {
                Console.WriteLine("Invalid LoginViewModel");
                return(Ok(StatusCodes.Status406NotAcceptable));
            }
        }
        //[HttpPost, Route("login"), AllowAnonymous]
        ////public async Task<IActionResult> Login([FromBody]JObject jo)
        //public async Task<IActionResult> Login()
        //{
        //    Console.WriteLine("call login~. No Parameter");
        //    //foreach (string key in Response.Headers.Keys)
        //    //{
        //    //    Console.WriteLine($"{key} : {Response.Headers[key]}");
        //    //}
        //    //Response.Cookies.Append("babo", "you~");
        //    //if (jo == null)
        //    //    return NoContent();
        //    //return await ClaimsLogin(jo);
        //    return Ok();
        //}

        //private async Task<IActionResult> ClaimsLogin([FromBody]JObject jo)
        //{
        //    bool isUservalid = false;
        //    LoginViewModel user = JsonConvert.DeserializeObject<LoginViewModel>(jo.ToString());

        //    if (ModelState.IsValid && isUservalid)
        //    {
        //        var claims = new List<Claim>();

        //        claims.Add(new Claim(ClaimTypes.Name, user.Email));


        //        var identity = new ClaimsIdentity(
        //            claims, JwtBearerDefaults.AuthenticationScheme);

        //        var principal = new ClaimsPrincipal(identity);

        //        var props = new AuthenticationProperties();
        //        props.IsPersistent = user.RememberMe;

        //        HttpContext.SignInAsync(
        //            IdentityConstants.ApplicationScheme,
        //            principal, props).Wait();
        //        string token = JasonWebTokenManager.GenerateToken(user.Email);
        //        return Ok(new { Token = token });
        //    }
        //    else
        //    {
        //        return BadRequest();
        //    }
        //}

        private async Task <IActionResult> OldLogin([FromBody] LoginModel jo)
        {
            //[FromBody]
            //JObject jo = null;
            Console.WriteLine($"Try Logging... {jo}");


            //UserAccount user = await _userManager.FindByNameAsync(input_user.Email);

            if (ModelState.IsValid)
            {
                Console.WriteLine($"Model State is Valid");
                Console.WriteLine(jo.ToString());
                UserAccountEF account = await _userManager.FindByEmailAsync(jo.Email);

                if (account == null)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).UserNotFound();
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }
                else if (account.SignInConfirm == false)
                {
                    IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).SignInNotConfirm(jo.Email);
                    IdentityResult _result = IdentityResult.Failed(error);
                    return(BadRequest(new { Result = _result }));
                }

                Microsoft.AspNetCore.Identity.SignInResult signResult = await _signInManager.PasswordSignInAsync(jo.Email, jo.Password, true, false);

                if (signResult.Succeeded)
                {
                    using (NHibernate.ISession session = _accountContext.SessionFactory.OpenSession())
                    {
                        var accountUser = await _userManager.FindByEmailAsync(jo.Email);

                        IList <Claim> claims = await _userManager.GetClaimsAsync(accountUser);

                        claims.Add(new Claim(ClaimTypes.NameIdentifier, accountUser.Id));
                        claims.Add(new Claim(ClaimTypes.Email, accountUser.Email));
                        claims.Add(new Claim(ClaimTypes.Name, accountUser.FirstName + accountUser.LastName));
                        if (accountUser.UserType == RegisterType.Aggregator)
                        {
                            VwAggregatoruser agg = await session.GetAsync <VwAggregatoruser>(accountUser.Id);

                            claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, agg.AggGroupId));
                            claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Aggregator));
                            if (string.IsNullOrEmpty(agg.AggName) == false)
                            {
                                claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, agg.AggName));
                            }

                            //var agg = _accountContext.VwAggregatorusers.FirstOrDefault(x => x.UserId == accountUser.Id);
                            //claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, agg.AggGroupId));
                            //claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Aggregator));
                            //if (string.IsNullOrEmpty(agg.AggName) == false)
                            //    claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, agg.AggName));
                        }
                        else if (accountUser.UserType == RegisterType.Contrator)
                        {
                            VwContractoruser con = await session.GetAsync <VwContractoruser>(accountUser.Id);

                            claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, con.AggGroupId));
                            claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Contractor));
                            if (string.IsNullOrEmpty(con.AggName) == false)
                            {
                                claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, con.AggName));
                            }

                            //var contractor = _accountContext.VwContractorusers.FirstOrDefault(x => x.UserId == accountUser.Id);
                            //claims.Add(new Claim(UserClaimTypes.AggregatorGroupIdentifier, contractor.AggGroupId));
                            //claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Contractor));
                            //if (string.IsNullOrEmpty(contractor.AggName) == false)
                            //    claims.Add(new Claim(UserClaimTypes.AggregatorGroupName, contractor.AggName));
                        }
                        else if (accountUser.UserType == RegisterType.Supervisor)
                        {
                            claims.Add(new Claim(ClaimTypes.Role, UserRoleTypes.Supervisor));
                        }


                        string token = JasonWebTokenManager.GenerateToken(jo.Email, UserClaimTypes.Issuer, claims);

                        //if (string.IsNullOrEmpty(returnUrl) == false)
                        //{
                        //    Console.WriteLine("returnurl:" + returnUrl);
                        //    return Redirect(returnUrl);
                        //}
                        Console.WriteLine("Log-in Success: " + jo.Email);
                        return(Ok(new { Result = signResult, Token = token, User = accountUser }));
                    }
                }
                else
                {
                    Console.WriteLine($"Login Failed");
                    //if (signResult.RequiresTwoFactor)
                    //{
                    //    return RedirectToAction("act", new { ReturnUrl = returnUrl, RememberMe = user.RememberMe });
                    //}
                    if (signResult.IsLockedOut)
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).UserLockoutEnabled();
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(BadRequest(new { Result = _result }));
                    }
                    else
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).PasswordMismatch();
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(BadRequest(new { Result = _result }));
                    }
                }
            }
            else
            {
                Console.WriteLine("Invalid LoginViewModel");
                return(Ok(StatusCodes.Status406NotAcceptable));
            }
        }