public async Task<ActionResult> Create(RegisterViewModel userViewModel, params string[] selectedRoles)
        {
            var globalBudgetPeriod = (await db.AppGlobalSettings.FirstOrDefaultAsync()).BudgetPeriodID;
            RegisterViewModel viewModel = new RegisterViewModel();

            if (ModelState.IsValid)
            {
                var newUser = new ApplicationUser
                {
                    FirstName = userViewModel.FirstName,
                    LastName = userViewModel.LastName,
                    Title = userViewModel.Title,
                    UserName = userViewModel.Email,
                    Email = userViewModel.Email,
                    AppModuleID = 1,
                    DeptID = userViewModel.DeptID,
                    DivID = userViewModel.DivID,
                    IsActive = true
                };
                // if password was not manually entered, generate random password and initialize account verification process
                string password;
                if (userViewModel.Password == null)
                {
                    password = await UserManager.GenerateRandomPasswordAsync();
                    newUser.AutoPwdReplaced = false;
                }
                else
                {
                    password = userViewModel.Password;
                    newUser.AutoPwdReplaced = true;
                }

                var adminresult = await UserManager.CreateAsync(newUser, password);
                string requestMessage = "";

                if (adminresult.Succeeded)
                {
                    // if password was not manually entered, send confirmation email with randomly generated password
                    if (userViewModel.Password == null)
                    {
                        string body;
                        using (var sr = new StreamReader(Server.MapPath("\\Templates\\") + "RegisterAccountEmailTemplate.html"))
                        {
                            body = await sr.ReadToEndAsync();
                        }
                        var code = await UserManager.GenerateEmailConfirmationTokenAsync(newUser.Id);
                        var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = newUser.Id, code = code }, protocol: Request.Url.Scheme);
                        string messageBody = string.Format(body, callbackUrl, newUser.UserName, password);
                        await UserManager.SendEmailAsync(newUser.Id, "Your AdminApps user account has been created. Please confirm your email address.", messageBody);
                    }

                    //Add User to the selected Roles 
                    if (selectedRoles != null)
                    {
                        var result = await UserManager.AddToRolesAsync(newUser.Id, selectedRoles);
                        if (!result.Succeeded)
                        {
                            ModelState.AddModelError("", result.Errors.First());
                            ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
                            // populate Dept/Div dropdowns
                            viewModel.DeptsList = new SelectList(await db.Depts.Where(b => b.BudgetPeriodID == globalBudgetPeriod).OrderBy(c => c.Code).ToListAsync(), "ID", "CompositeDeptName");
                            viewModel.DivsList = new SelectList(await db.Divs.Where(b => b.BudgetPeriodID == globalBudgetPeriod).OrderBy(c => c.Code).ToListAsync(), "ID", "CompositeDivName");

                            return View(viewModel);
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", adminresult.Errors.First());
                    ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
                    // populate Dept/Div dropdowns
                    viewModel.DeptsList = new SelectList(await db.Depts.Where(b => b.BudgetPeriodID == globalBudgetPeriod).OrderBy(c => c.Code).ToListAsync(), "ID", "CompositeDeptName");
                    viewModel.DivsList = new SelectList(await db.Divs.Where(b => b.BudgetPeriodID == globalBudgetPeriod).OrderBy(c => c.Code).ToListAsync(), "ID", "CompositeDivName");
                    return View(viewModel);

                }
                Success("User was created successfully. " + requestMessage, true);
                return RedirectToAction("Index");
            }
            ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
            // populate Dept/Div dropdowns
            viewModel.DeptsList = new SelectList(await db.Depts.Where(b => b.BudgetPeriodID == globalBudgetPeriod).OrderBy(c => c.Code).ToListAsync(), "ID", "CompositeDeptName");
            viewModel.DivsList = new SelectList(await db.Divs.Where(b => b.BudgetPeriodID == globalBudgetPeriod).OrderBy(c => c.Code).ToListAsync(), "ID", "CompositeDivName");
            return View(viewModel);
        }
        public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
        {
            if (User.Identity.IsAuthenticated)
            {
                return RedirectToAction("Index", "Manage");
            }

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

            ViewBag.ReturnUrl = returnUrl;
            return View(model);
        }
 private async Task SignInAsync(ApplicationUser user, bool isPersistent)
 {
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie);
     AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager));
 }
        // original action was async, but the action was made synchronous because the 'await' operator was commented out below
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            // disable Register action; users can only be manually created by IdentityManager or UserManager roles
            //return RedirectToAction("Index", "Home");

            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { FirstName = model.FirstName, LastName = model.LastName, DeptID = model.DeptID, DivID = model.DivID, UserName = model.Email, Email = model.Email, AppModuleID = 1, IsActive = true };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    var rolesForUser = UserManager.GetRoles(user.Id);
                    if (!rolesForUser.Contains("CIPUser"))
                    {
                        // add user to CIPUser role
                        UserManager.AddToRole(user.Id, "CIPUser");
                    }

                    var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    string body;
                    using (var sr = new StreamReader(Server.MapPath("~/Templates/") + "NewUserRegistrationConfirmation.html"))
                    {
                        body = await sr.ReadToEndAsync();
                    }
                    string messageBody = string.Format(body, callbackUrl);
                    await UserManager.SendEmailAsync(user.Id, "Welcome New User", messageBody);
                    ViewBag.Link = callbackUrl;
                    return View("DisplayEmail");
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form

            // populate Dept/Div dropdowns
            AppGlobalSetting appGlobalSetting = await _unitOfWork.AppGlobalSettingRepository.GetFirstOrDefaultAsync();
            model.DeptsList = new SelectList(await _unitOfWork.DeptRepository.GetAsync(d => d.BudgetPeriodID == appGlobalSetting.BudgetPeriodID, q => q.OrderBy(d => d.Code)), "ID", "CompositeDeptName");
            model.DivsList = new SelectList(await _unitOfWork.DivRepository.GetAsync(d => d.BudgetPeriodID == appGlobalSetting.BudgetPeriodID, q => q.OrderBy(d => d.Code)), "ID", "CompositeDivName");

            return View(model);
        }