public void UsernameConstructorPopulatesId()
        {
            var user = new IdentityUser("Test");
            var user2 = new IdentityUser("Test2");

            user.Id.Should().NotBeNullOrWhiteSpace();
            user2.Id.Should().NotBe(user.Id);
        }
        public void IdIsGeneratedAutomatically()
        {
            var user = new IdentityUser();
            var user2 = new IdentityUser();

            user.Id.Should().NotBeNullOrWhiteSpace();
            user2.Id.Should().NotBe(user.Id);
        }
        public async Task<IActionResult> Index()
        {
            var stopWatch = new Stopwatch();
            long createTime, deleteTime;

            stopWatch.Start();

            var role = new IdentityRole("TestRole");
            var users = new IdentityUser[1000];

            await _roleManager.CreateAsync(role);

            for (int i = 0; i < 1000; ++i)
            {
                var user = new IdentityUser
                {
                    UserName = "******" + i,
                    Email = $"test{i}@test.com",
                };

                users[i] = user;
                await _userManager.CreateAsync(user, "Password123*");
                await _userManager.AddToRoleAsync(user, "TestRole");
            }

            stopWatch.Stop();
            createTime = stopWatch.ElapsedMilliseconds;

            stopWatch.Reset();
            stopWatch.Start();

            for (int i = 0; i < 1000; ++i)
            {
                var user = users[i];
                await _userManager.RemoveFromRoleAsync(user, "TestRole");
                await _userManager.DeleteAsync(user);
            }
            await _roleManager.DeleteAsync(role);

            stopWatch.Stop();
            deleteTime = stopWatch.ElapsedMilliseconds;

            var response = $"Create time: {createTime}ms\r\nDelete Time: {deleteTime}ms";

            return Content(response);
        }
        public void UsernameConstructorPopulates()
        {
            var user = new IdentityUser("TestUser");

            user.UserName.Should().Be("TestUser");
        }
        /// <summary>
        /// Adds the standard dummy users to the DB, uses NPOCO to save
        /// </summary>
        private void CreateDummyUsers()
        {
            var user = new IdentityUser(TestUserName)
            {
                NormalizedUserName = TestUserName,
                Email = TestUserEmail,
                NormalizedEmail = TestUserEmail,
                PasswordHash = TestUserPassword
            };

            var user2 = new IdentityUser("Dont Use Me")
            {
                NormalizedUserName = "******",
                Email = "*****@*****.**",
                NormalizedEmail = "*****@*****.**",
                PasswordHash = "goaway"
            };

            var dummyLogin = new UserLogin()
            {
                ProviderKey = "Dummy",
                LoginProvider = "LoginProvider",
                ProviderDisplayName = "DummyDontUse",
                UserId = user2.Id
            };

            var role = new IdentityRole(TestRoleName)
            {
                NormalizedName = TestRoleName
            };

            var testClaim = new UserClaim
            {
                ClaimType = TestClaimType,
                ClaimValue = TestClaimValue,
                UserId = user.Id
            };

            using (var db = new Database(ConnectionString, ProviderName))
            {
                db.Insert(user);
                db.Insert(user2);
                db.Insert(dummyLogin);
                db.Insert(role);
                db.Insert(testClaim);
            }

            _testUserId = user.Id;
            _testRoleId = role.Id;
        }
        /// <summary>
        /// Get a specific user directly from the DB using ADO.NET rather than NPOCO. Ideal for checking data matches between store/NPOCO and the actual DB
        /// </summary>
        /// <param name="id">ID of user</param>
        /// <returns>User or NULL</returns>
        public IdentityUser GetUser(string id)
        {
            IdentityUser user = null;

            using (var conn = new SqlConnection(ConnectionString))
            using (var cmd = new SqlCommand("SELECT * FROM AspNetUsers WHERE Id = @Id", conn))
            {
                cmd.Parameters.AddWithValue("@Id", id);

                conn.Open();

                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        int col = 0;
                        user = new IdentityUser();

                        // Read in user data
                        user.Id = reader.GetString(col++);
                        user.AccessFailedCount = reader.GetInt32(col++);
                        user.ConcurrencyStamp = reader.GetStringSafe(col++);
                        user.Email = reader.GetStringSafe(col++);
                        user.EmailConfirmed = reader.GetBoolean(col++);
                        user.LockoutEnabled = reader.GetBoolean(col++);
                        user.LockoutEnd = reader.GetDateTimeOffsetSafe(col++);
                        user.NormalizedEmail = reader.GetStringSafe(col++);
                        user.NormalizedUserName = reader.GetStringSafe(col++);
                        user.PasswordHash = reader.GetStringSafe(col++);
                        user.PhoneNumber = reader.GetStringSafe(col++);
                        user.PhoneNumberConfirmed = reader.GetBoolean(col++);
                        user.SecurityStamp = reader.GetStringSafe(col++);
                        user.TwoFactorEnabled = reader.GetBoolean(col++);
                        user.UserName = reader.GetStringSafe(col++);
                    }
                }

                conn.Close();
            }

            return user;
        }
        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new IdentityUser { UserName = model.Email, Email = model.Email };
                var result = await _userManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
                    // Send an email with this link
                    //var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                    //var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
                    //await _emailSender.SendEmailAsync(model.Email, "Confirm your account",
                    //    "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
                    await _signInManager.SignInAsync(user, isPersistent: false);
                    return RedirectToAction(nameof(HomeController.Index), "Home");
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }
        public async Task<IActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl = null)
        {
            if (User.IsSignedIn())
            {
                return RedirectToAction(nameof(ManageController.Index),"Manage");
            }

            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                var info = await _signInManager.GetExternalLoginInfoAsync();
                if (info == null)
                {
                    return View("ExternalLoginFailure");
                }
                var user = new IdentityUser { UserName = model.Email, Email = model.Email };
                var result = await _userManager.CreateAsync(user);
                if (result.Succeeded)
                {
                    result = await _userManager.AddLoginAsync(user, info);
                    if (result.Succeeded)
                    {
                        await _signInManager.SignInAsync(user, isPersistent: false);
                        return RedirectToLocal(returnUrl);
                    }
                }
                AddErrors(result);
            }

            ViewData["ReturnUrl"] = returnUrl;
            return View(model);
        }