Предотвратить множественный вход в приложение asp.net MVC 4 - PullRequest
0 голосов
/ 19 мая 2018

Система требует входа одного пользователя одновременно.При попытке одновременного входа в систему несколько раз пользователь блокируется.Я использовал Cookie Authentication, которая будет управляться из браузера клиента.

Код входа в систему:

 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginViewModel oLoginViewModel)
        {
            try
            {
                bool Result = new UserBL().ValidateUser(oLoginViewModel.UserName, oLoginViewModel.Password);
                if (Result == true)
                {
                    FormsService.SignIn(oLoginViewModel.UserName, oLoginViewModel.RememberMe);
                    CreateAuthenticationTicket(oLoginViewModel.UserName);
                    return RedirectToLocal(Request.Form["returnUrl"]);
                }
                else
                    ViewBag.Error = "Invalid Username or Password / Due to simultaneous login you get blocked.";

                return View();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void CreateAuthenticationTicket(string username)
            {

                Users oUsers = new Users();
                oUsers.Email = username;
                oUsers.Role = "User";
                int sessionid = new UserBL().GetByUserName(username).UserId;
                string userData = JsonConvert.SerializeObject(oUsers);
                FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,
    username,
    DateTime.Now,
    DateTime.Now.AddYears(1), // value of time out property
    false, //pass here true, if you want to implement remember me functionality
    userData);
                string encTicket = FormsAuthentication.Encrypt(authTicket);
                var isSsl = Request.IsSecureConnection; // if we are running in SSL mode then make the cookie secure only
                HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)
                {
                    HttpOnly = false,
                    Secure = isSsl,
                };
                faCookie.Expires = DateTime.Now.AddYears(1);
                Response.Cookies.Add(faCookie);

                //Login Repository Entry
                LoginsRepository oLogin = new LoginsRepository();
                oLogin.UserName = username;
                oLogin.SessionId = sessionid.ToString();
                oLogin.LoggedIn = true;
                oLogin.CreatedOn = Utility.CommonFunction.DateTime_Now();
                oLogin.IPAddress = HttpContext.Request.RequestContext.HttpContext.Request.ServerVariables["REMOTE_ADDR"];
                oLogin.Status = En_LoginStatus.SingleUser.ToString();

                new LoginRepositoryBL().Add(oLogin);
            }

Я сохраняю имя пользователя для каждого пользователя со своим IP-адресом, чтобы проверить множественный вход пользователя.

После входа он перенаправляется на домашний контроллер иЯ проверил логику множественного входа в систему из таблицы базы данных Loginsrepository, которая упоминалась выше:

 public class HomeController : CustomerBaseController
{
    public ActionResult Index()
    {
        Users oUser = new Users();
        oUser = new UserBL().getActiveUser();

        // check to see if your ID in the Logins table has 
        // LoggedIn = true - if so, continue, otherwise, redirect to Login page.
        if (new LoginRepositoryBL().IsYourLoginStillTrue(System.Web.HttpContext.Current.User.Identity.Name, oUser.UserId.ToString()))
        {
            // check to see if your user ID is being used elsewhere under a different session ID
            if (!new LoginRepositoryBL().IsUserLoggedOnElsewhere(System.Web.HttpContext.Current.User.Identity.Name, oUser.UserId.ToString()))
            {
                Answers oAnswer = new Answers();
                return View(oAnswer);
            }
            else
            {
                // if it is being used elsewhere, update all their 
                // Logins records to LoggedIn = false, except for your session ID
                new LoginRepositoryBL().LogEveryoneElseOut(System.Web.HttpContext.Current.User.Identity.Name, oUser.UserId.ToString());
                Answers oAnswer = new Answers();
                return View(oAnswer);
            }
        }
        else
        {
            oUser = new UserBL().GetByUserName(System.Web.HttpContext.Current.User.Identity.Name);
            oUser.Status = En_Status.Inactive.ToString();
            new UserBL().update(oUser);

            FormsService.SignOut();
            FormsAuthentication.SignOut();
            return RedirectToAction("Login", "Account");
        }
    }
}

Вышеуказанные методы:

       public bool IsYourLoginStillTrue(string userId, string sid)
    {
        try
        {
            using (var ctx = new CnSiteEntities())
            {
                IEnumerable<LoginsRepository> logins = (from i in ctx.LoginsRepository
                                                        where i.LoggedIn == true &&
                                                        i.UserName == userId && i.SessionId == sid
                                                        select i).AsEnumerable();
                return logins.Any();
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

    public bool IsUserLoggedOnElsewhere(string userId, string sid)
    {
        try
        {
            using (var ctx = new CnSiteEntities())
            {
                IEnumerable<LoginsRepository> logins = (from i in ctx.LoginsRepository
                                                        where i.LoggedIn == true &&
                                                        i.UserName == userId && i.SessionId != sid
                                                        select i).AsEnumerable();
                return logins.Any();

            }
        }
        catch (Exception)
        {

            throw;
        }
    }

    public void LogEveryoneElseOut(string userId, string sid)
    {
        try
        {

            using (var ctx = new CnSiteEntities())
            {
                IEnumerable<LoginsRepository> logins = (from i in ctx.LoginsRepository
                                              where i.LoggedIn == true &&
                                              i.UserName == userId &&
                                              i.SessionId != sid // need to filter by user ID
                                              select i).AsEnumerable();

                foreach (LoginsRepository item in logins)
                {
                    item.LoggedIn = false;
                }

                ctx.SaveChanges();
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

Не работает должным образом.Это остается верным после входа в систему, даже если несколько одновременных входов.Я гуглил и много пробовал, но не нашел решения.Пожалуйста, поделитесь некоторыми ссылками или дайте какие-либо решения для этого.Спасибо за чтение всей проблемы и ваши решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...