public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
        {
            bool isExist = false;

            returnUrl = returnUrl ?? Url.Content("~/");
            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: {remoteError}";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }


            var userID = _context.AspNetUserLogins.Where(p => p.ProviderKey == info.ProviderKey && p.LoginProvider == info.LoginProvider).SingleOrDefault().UserId;
            var user   = _context.AspNetUsers.Where(p => p.Id == userID).SingleOrDefault();

            BDS_ML.Models.ModelDB.Admin admin = new Models.ModelDB.Admin();
            Customer cus = new Customer();

            if (user != null)
            {
                isExist = true;

                if (user.IsBlock != 0)
                {
                    if (user.IsAdmin == 0)
                    {
                        cus = _context.Customer.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                        var block = _context.Block.Where(b => b.ID_User == cus.ID_User).OrderBy(p => p.ModifiedDate).LastOrDefault();
                        if (block.UnLockDate <= DateTime.Now)
                        {
                            try
                            {
                                block.ModifiedDate = DateTime.Now.Date;
                                user.IsBlock       = 0;
                                _context.AspNetUsers.Attach(user);
                                _context.Entry(user).State = Microsoft.EntityFrameworkCore.EntityState.Modified;

                                _context.Block.Attach(block);
                                _context.Entry(block).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                                _context.SaveChanges();
                            }
                            catch { }
                        }
                        else
                        {
                            ErrorMessage = "Tài khoản bị khóa!. Lí do: " + block.Reason + ".";
                            return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
                        }
                    }
                    if (user.IsAdmin == 1)
                    {
                        admin = _context.Admin.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                        var block = _context.Block.Where(b => b.ID_User == admin.ID_Admin).OrderBy(p => p.ModifiedDate).LastOrDefault();
                        if (block.UnLockDate <= DateTime.Now)
                        {
                            try
                            {
                                block.ModifiedDate = DateTime.Now.Date;
                                user.IsBlock       = 0;
                                _context.AspNetUsers.Attach(user);
                                _context.Entry(user).State = Microsoft.EntityFrameworkCore.EntityState.Modified;

                                _context.Block.Attach(block);
                                _context.Entry(block).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                                _context.SaveChanges();
                            }
                            catch { }
                        }
                        else
                        {
                            ErrorMessage = "Tài khoản bị khóa!. Lí do: " + block.Reason + ".";
                            return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
                        }
                    }
                }
            }

            // Sign in the user with this external login provider if the user already has a login.
            var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true);

            if (result.Succeeded)
            {
                string urlavatar = "";
                if (user.IsAdmin == 1)
                {
                    admin      = _context.Admin.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                    urlavatar += admin.Avatar_URL;
                }
                else
                {
                    cus        = _context.Customer.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                    urlavatar += cus.Avatar_URL;
                }
                HttpContext.Session.SetString("AvatarImage", urlavatar);
                _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
                return(LocalRedirect(returnUrl));
            }
            if (result.IsLockedOut)
            {
                return(RedirectToPage("./Lockout"));
            }
            else if (isExist)
            {
                return(RedirectToPage("./ExternalExistEmail"));
            }
            else
            {
                // If the user does not have an account, then ask the user to create an account.
                ReturnUrl     = returnUrl;
                LoginProvider = info.LoginProvider;
                if (info.Principal.HasClaim(c => c.Type == ClaimTypes.Email))
                {
                    Input = new InputModel
                    {
                        Email       = info.Principal.FindFirstValue(ClaimTypes.Email),
                        FirstName   = info.Principal.FindFirstValue(ClaimTypes.GivenName),
                        LastName    = info.Principal.FindFirstValue(ClaimTypes.Surname),
                        Address     = info.Principal.FindFirstValue(ClaimTypes.Country),
                        PhoneNumber = info.Principal.FindFirstValue(ClaimTypes.MobilePhone)
                    };
                }
                return(Page());
            }
        }
Exemplo n.º 2
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            var user = _context.AspNetUsers.Where(p => p.UserName == Input.Email).SingleOrDefault();

            if (user == null)
            {
                ModelState.AddModelError(string.Empty, "Đăng nhập không thành công!.");
                return(Page());
            }
            BDS_ML.Models.ModelDB.Admin admin = new Models.ModelDB.Admin();
            Customer cus = new Customer();

            if (user.IsBlock != 0)
            {
                if (user.IsAdmin == 0)
                {
                    cus = _context.Customer.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                    var block = _context.Block.Where(b => b.ID_User == cus.ID_User).OrderBy(p => p.ModifiedDate).LastOrDefault();
                    if (block.UnLockDate.GetValueOrDefault().Date <= DateTime.Now.Date)
                    {
                        try
                        {
                            block.ModifiedDate = DateTime.Now.Date;
                            user.IsBlock       = 0;
                            _context.AspNetUsers.Attach(user);
                            _context.Entry(user).State = Microsoft.EntityFrameworkCore.EntityState.Modified;

                            _context.Block.Attach(block);
                            _context.Entry(block).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                            _context.SaveChanges();
                        }
                        catch { }
                    }
                    else
                    {
                        ModelState.AddModelError(string.Empty, "Tài khoản bị khóa!. Lí do: " + block.Reason);
                        return(Page());
                    }
                }
                if (user.IsAdmin == 1)
                {
                    admin = _context.Admin.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                    var block = _context.Block.Where(b => b.ID_User == admin.ID_Admin).OrderBy(p => p.ModifiedDate).LastOrDefault();
                    if (block.UnLockDate <= DateTime.Now)
                    {
                        try
                        {
                            block.ModifiedDate = DateTime.Now.Date;
                            user.IsBlock       = 0;
                            _context.AspNetUsers.Attach(user);
                            _context.Entry(user).State = Microsoft.EntityFrameworkCore.EntityState.Modified;

                            _context.Block.Attach(block);
                            _context.Entry(block).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                            _context.SaveChanges();
                        }
                        catch { }
                    }
                    else
                    {
                        ModelState.AddModelError(string.Empty, "Tài khoản bị khóa!. Lí do: " + block.Reason);
                        return(Page());
                    }
                }
            }
            if (ModelState.IsValid)
            {
                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true

                var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure : true);

                if (result.Succeeded)
                {
                    string urlavatar = "";
                    if (user.IsAdmin == 1)
                    {
                        admin      = _context.Admin.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                        urlavatar += admin.Avatar_URL;
                    }
                    else
                    {
                        cus        = _context.Customer.Where(c => c.Account_ID == user.Id).SingleOrDefault();
                        urlavatar += cus.Avatar_URL;
                    }
                    HttpContext.Session.SetString("AvatarImage", urlavatar);
                    _logger.LogInformation("User logged in.");
                    return(LocalRedirect(returnUrl));
                }
                if (result.RequiresTwoFactor)
                {
                    return(RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe }));
                }
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("User account locked out.");
                    return(RedirectToPage("./Lockout"));
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Đăng nhập không thành công!.");
                    return(Page());
                }
            }

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