protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();

            Database.SetInitializer<MembershipContext>(new MembershipInitializer());
            MembershipContext context = new MembershipContext();
            context.Database.Initialize(true);
        }
        public ActionResult Authenticate(TwoFactorModel model, string userName, bool rememberMe, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                User user;
                using (var db = new MembershipContext())
                {
                    user = db.Users.FirstOrDefault(u => string.Compare(u.UserName, userName, true) == 0);
                };

                bool userIsValid = TwoFactorPasswordGenerator.GenerateTimeBasedPassword(user.TwoFactorSecret) == model.TwoFactorCode;
                if (userIsValid)
                {
                    FormsAuthentication.SetAuthCookie(user.UserName, rememberMe);
                    return RedirectToLocal(returnUrl);
                }
            }

            // If we got this far, something failed, redisplay form
            ModelState.AddModelError("", "The Google Authenticator code is invalid.");
            return View(model);
        }
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer<MembershipContext>(null);

                try
                {
                    using (var context = new MembershipContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }

                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "UserId", "UserName", autoCreateTables: true);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                }
            }
        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            using (var db = new MembershipContext())
            {
                var strComparer = new StringEqualityComparer();
                var users = db.Users.Where(u => usernames.Contains(u.UserName, strComparer)).Include(u => u.Roles).ToList();
                Role[] roles = db.Roles.Where(r => roleNames.Contains(r.RoleName, strComparer)).Select(r => r.RoleId).ToArray();

                if ((users != null && users.Count > 0) && (roles != null && roles.Length > 0))
                {
                    foreach (var user in users)
                    {
                        Role[] userRoles = user.Roles.Select(r => r.RoleId).ToArray();
                        Role[] missingRoles = roles.Where(r => !userRoles.Contains(r)).ToArray();
                        for (int i = 0; i < missingRoles.Length; i++)
                        {
                            user.Roles.Add(new UserUserRole() { RoleId = missingRoles[i] });
                        }
                    }
                    db.SaveChanges();
                }
            }
        }
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                User user;
                bool userIsValid = false;

                using (var db = new MembershipContext())
                {
                    user = db.Users.FirstOrDefault(u => string.Compare(u.UserName, model.UserName, true) == 0);

                    var memProvider = (EqmMembershipProvider)Membership.Provider;
                    userIsValid = memProvider.ValidateUser(user, model.Password);

                    if (userIsValid)
                    {
                        user.LastLoginDate = DateTime.Now;
                        db.SaveChanges();
                    }
                };

                if (userIsValid && !user.IsGoogleAuthenticatorEnabled)
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    return RedirectToLocal(returnUrl);
                }
                else if (userIsValid && user.IsGoogleAuthenticatorEnabled)
                {
                    // redirect to the Google two-factor view
                    return RedirectToAction("Authenticate", "TwoFactor", new { UserName = model.UserName, RememberMe = model.RememberMe, ReturnUrl = returnUrl });
                }
            }

            // If we got this far, something failed, redisplay form
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
            return View(model);
        }
        public override DateTime GetCreateDate(string userName)
        {
            User user;
            using (var db = new MembershipContext())
            {
                user = db.Users.FirstOrDefault(u => string.Compare(u.UserName, userName, true) == 0);
            };

            return user != null ? user.CreationDate : DateTime.MinValue;
        }
        public override string[] GetRolesForUser(string username)
        {
            string[] roles = new string[0];
            using (var db = new MembershipContext())
            {
                var user = db.Users.Include(u => u.Roles).FirstOrDefault(u => string.Compare(u.UserName, username, true) == 0);

                Role[] userRoles = user != null
                    ? (from r in user.Roles select r.RoleId).ToArray()
                    : new Role[0];

                roles = userRoles.Length > 0
                    ? (from r in db.Roles where userRoles.Contains(r.RoleId) select r.RoleName).ToArray()
                    : new string[0];
            }
            return roles;
        }
        public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
        {
            using (var db = new MembershipContext())
            {
                var strComparer = new StringEqualityComparer();

                UserUserRole[] userRoles = (from u in db.Users
                                            join ur in db.UserRoles on u.UserId equals ur.UserId
                                            join r in db.Roles on ur.RoleId equals r.RoleId
                                            where usernames.Contains(u.UserName, strComparer)
                                            && roleNames.Contains(r.RoleName, strComparer)
                                            select ur).ToArray();

                DbSet<UserUserRole> dbSet = db.Set<UserUserRole>();
                foreach (var uRole in userRoles)
                {
                    if (db.Entry(uRole).State == System.Data.EntityState.Detached)
                        dbSet.Attach(uRole);
                    dbSet.Remove(uRole);
                }

                if (userRoles.Length > 0) db.SaveChanges();
            }
        }
        public override bool RoleExists(string roleName)
        {
            bool roleExists = false;

            using (var db = new MembershipContext())
            {
                roleExists = db.Roles.FirstOrDefault(r => string.Compare(r.RoleName, roleName, true) == 0) != null;
            }

            return roleExists;
        }
 public override string[] GetUsersInRole(string roleName)
 {
     string[] userNames = new string[0];
     using (var db = new MembershipContext())
     {
         var role = db.Roles.FirstOrDefault(r => string.Compare(r.RoleName, roleName, true) == 0);
         if (role != null)
         {
             userNames = (from u in db.Users
                          join ur in db.UserRoles on u.UserId equals ur.UserId
                          where ur.RoleId == role.RoleId
                          select u.UserName).ToArray();
         }
     }
     return userNames;
 }
        public override bool IsUserInRole(string username, string roleName)
        {
            bool isUserInRole = false;

            using (var db = new MembershipContext())
            {
                User user = (from u in db.Users
                             join ur in db.UserRoles on u.UserId equals ur.UserId
                             join r in db.Roles on ur.RoleId equals r.RoleId
                             where (string.Compare(u.UserName, username, true) == 0
                         && string.Compare(r.RoleName, roleName, true) == 0)
                             select u).FirstOrDefault();

                isUserInRole = user != null;
            }

            return isUserInRole;
        }
        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
        {
            User user;
            using (var db = new MembershipContext())
            {
                user = db.Users.FirstOrDefault(u => u.UserId == Convert.ToInt32(providerUserKey));
            };

            var memberUser = user != null ? new EqmMembershipUser(this.Name, user) : new EqmMembershipUser();
            if (userIsOnline) memberUser.LastActivityDate = DateTime.Now;
            return memberUser;
        }
        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            User user;
            using (var db = new MembershipContext())
            {
                user = db.Users.FirstOrDefault(u => string.Compare(u.UserName, username, true) == 0);
            };

            var memberUser = user != null ? new EqmMembershipUser(this.Name, user) : new EqmMembershipUser();
            if (userIsOnline) memberUser.LastActivityDate = DateTime.Now;
            return memberUser;
        }
 public override string CreateUserAndAccount(string userName, string password, bool requireConfirmation, IDictionary<string, object> values)
 {
     var newUser = new User() { UserName = userName };
     newUser.EncryptedPassword = password.EncryptSha512(newUser.Salt);
     newUser.IsGoogleAuthenticatorEnabled = (bool)values["IsGoogleAuthenticatorEnabled"];
     newUser.TwoFactorSecret = TwoFactorSecretGenerator.GenerateSecretKey();
     newUser.CreationDate = newUser.LastLoginDate = DateTime.Now;
     using (var db = new MembershipContext())
     {
         db.Set<User>().Add(newUser);
         db.SaveChanges();
     }
     return newUser.UserId.ToString();
 }
        public ActionResult ShowTwoFactorSecret(ShowTwoFactorSecretViewModel model)
        {
            using (var db = new MembershipContext())
            {
                User user = db.Users.Single(u => u.UserId == WebSecurity.CurrentUserId);

                if (TwoFactorPasswordGenerator.GenerateTimeBasedPassword(user.TwoFactorSecret) != model.TwoFactorCode)
                {
                    ModelState.AddModelError("TwoFactorCode", "The Code is not valid");
                    model.SecretKey = Base32.Base32Encoder.Encode(System.Text.Encoding.ASCII.GetBytes(user.TwoFactorSecret));

                    user.IsGoogleAuthenticatorEnabled = model.EnableTwoFactorAuthentication = false;

                    return View(model);
                }
                else
                {
                    user.IsGoogleAuthenticatorEnabled = true;
                }

                db.SaveChanges();
            }

            return RedirectToAction("Index", "Home");
        }
        //
        // GET: /Account/ShowTwoFactorSecret
        public ActionResult ShowTwoFactorSecret()
        {
            ShowTwoFactorSecretViewModel model = null;

            using (var db = new MembershipContext())
            {
                User user = db.Users.Single(u => u.UserId == WebSecurity.CurrentUserId);

                model = new ShowTwoFactorSecretViewModel()
                {
                    UserName = user.UserName,
                    EnableTwoFactorAuthentication = user.IsGoogleAuthenticatorEnabled,
                    SecretKey = Base32.Base32Encoder.Encode(System.Text.Encoding.ASCII.GetBytes(user.TwoFactorSecret))
                };
            }

            return View(model);
        }
 public override bool ChangePassword(string username, string oldPassword, string newPassword)
 {
     bool isPwdChanged = false;
     using (var db = new MembershipContext())
     {
         User user = db.Users.FirstOrDefault(u => string.Compare(u.UserName, username, true) == 0);
         if (ValidateUser(user, oldPassword))
         {
             user.EncryptedPassword = newPassword.EncryptSha512(user.Salt);
             db.SaveChanges();
             isPwdChanged = true;
         }
     };
     return isPwdChanged;
 }
 public override bool ValidateUser(string username, string password)
 {
     User user;
     using (var db = new MembershipContext())
     {
         user = db.Users.FirstOrDefault(u => string.Compare(u.UserName, username, true) == 0);
     };
     return ValidateUser(user, password);
 }