private async Task <bool> SetLockout(UserAccountInfoViewModel model, TicketDeskUser user)
        {
            var currentlyLocked   = UserManager.IsLockedOut(model.User.Id);
            var currentlyDisabled = currentlyLocked && (user.LockoutEndDateUtc ?? DateTime.MinValue).ToUniversalTime() == DateTime.MaxValue.ToUniversalTime();

            if (currentlyDisabled != model.IsDisabled || currentlyLocked != model.IsLocked)
            {
                DateTimeOffset newLockoutDate = DateTimeOffset.MinValue;
                if (model.IsDisabled)
                {
                    newLockoutDate = DateTimeOffset.MaxValue;
                }
                else if (model.IsLocked)
                {
                    newLockoutDate = DateTimeOffset.Now.Add(UserManager.DefaultAccountLockoutTimeSpan);
                }

                var result = await UserManager.SetLockoutEndDateAsync(model.User.Id, newLockoutDate);

                if (!result.Succeeded)
                {
                    AddErrors(result);
                }
                return(result.Succeeded);
            }
            return(true);
        }
 private async Task SignInAsync(TicketDeskUser user, bool isPersistent)
 {
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie);
     AuthenticationManager.SignIn(new AuthenticationProperties {
         IsPersistent = isPersistent
     }, await user.GenerateUserIdentityAsync(UserManager));
 }
        public async Task <ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new TicketDeskUser {
                    UserName = model.Email, Email = model.Email, DisplayName = model.DisplayName
                };
                var result = await UserManager.CreateAsync(user, model.Password);

                if (result.Succeeded)
                {
                    await SignInManager.SignInAsync(user, isPersistent : false, rememberBrowser : false);

                    await UserManager.AddToRoleAsync(user.Id, "TdInternalUsers");

                    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                    // Send an email with this link
                    // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                    return(RedirectToAction("Index", "Home"));
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return(View(model));
        }
Example #4
0
        public UserAccountInfoViewModel(TicketDeskUser user, IEnumerable <string> roles)
        {
            var lockDate = (user.LockoutEndDateUtc ?? DateTime.MinValue).ToUniversalTime();

            User       = user;
            IsLocked   = lockDate > DateTime.UtcNow && lockDate < DateTime.MaxValue.ToUniversalTime();
            IsDisabled = lockDate == DateTime.MaxValue.ToUniversalTime();
            Roles      = roles ?? new string[] {};
        }
        public void InitializeUsers(TicketDeskIdentityContext context)
        {
            var demoMode = ConfigurationManager.AppSettings["ticketdesk:DemoModeEnabled"];

            if (!string.IsNullOrEmpty(demoMode) && demoMode.Equals("true", StringComparison.InvariantCultureIgnoreCase))
            {
                DemoIdentityDataManager.SetupDemoIdentityData(context);
            }
            else//TODO: move this block to the context itself, and ensure that at least one admin account exists no matter what
            {
                //create the standard roles and default admin account
                var userStore = new UserStore <TicketDeskUser>(context);
                var roleStore = new RoleStore <IdentityRole>(context);

                //TODO: this user manager has a default config, need to leverage the same user manager as the rest of the application
                var userManager = new UserManager <TicketDeskUser>(userStore);
                var roleManager = new RoleManager <IdentityRole>(roleStore);

                var roleNames = context.DefaultRoleNames;
                foreach (var roleName in roleNames)
                {
                    //Create Role if it does not exist
                    var role = roleManager.FindByName(roleName);
                    if (role == null)
                    {
                        role = new IdentityRole(roleName);
                        roleManager.Create(role);
                    }
                }

                var existingAdminRole = roleManager.FindByName("TdAdministrators");
                //only create default admin user if no other user exists with the admin role
                if (existingAdminRole != null &&
                    !userManager.Users.Any(u => u.Roles.Any(r => r.RoleId == existingAdminRole.Id)))
                {
                    var admin = new TicketDeskUser
                    {
                        Id          = "64165817-9cb5-472f-8bfb-6a35ca54be6a",
                        UserName    = "******",
                        Email       = "*****@*****.**",
                        DisplayName = "Admin User",
                    };
                    if (userManager.FindById("64165817-9cb5-472f-8bfb-6a35ca54be6a") == null)
                    {
                        var adminRoles = new[] { "TdAdministrators", "TdHelpDeskUsers", "TdInternalUsers" };
                        userManager.Create(admin, "123456");

                        userManager.SetLockoutEnabled(admin.Id, false);

                        foreach (var rname in adminRoles)
                        {
                            userManager.AddToRole(admin.Id, rname);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Migrates the users and roles from a legacy database to the new TD 2.5 schema.
        /// </summary>
        /// <param name="context">The identity database context</param>
        /// <param name="userManager">The user manager.</param>
        /// <param name="roleManager">The role manager.</param>
        /// <returns><c>true</c> if users migrated, <c>false</c> otherwise.</returns>
        public static bool MigrateSecurity(TdIdentityContext context, TicketDeskUserManager userManager, TicketDeskRoleManager roleManager)
        {
            roleManager.EnsureDefaultRolesExist();
            var appId =
                context.Database.SqlQuery <Guid>(
                    "select ApplicationId from aspnet_Applications where ApplicationName = 'TicketDesk'").First().ToString();
            var users = context.Database.SqlQuery <LegacyUser>(
                "select UserId, Email, Password, PasswordFormat, Comment from aspnet_Membership where ApplicationId = '" + appId + "' and IsApproved = 1 and IsLockedOut = 0").ToList();
            const string roleQuery = "SELECT r.RoleName FROM aspnet_UsersInRoles u inner join aspnet_Roles r on u.RoleId = r.RoleId WHERE u.UserId = @userId and r.ApplicationId = @appId";

            foreach (var user in users)
            {
                var newUser = new TicketDeskUser
                {
                    UserName    = user.Email,
                    Email       = user.Email,
                    DisplayName = user.Comment,
                };

                var result = user.PasswordFormat == 0 ?
                             userManager.Create(newUser, user.Password) :
                             userManager.Create(newUser);

                if (result.Succeeded)
                {
                    var rolesForUser =
                        context.Database.SqlQuery <string>(roleQuery,
                                                           new SqlParameter("userId", user.UserId),
                                                           new SqlParameter("appId", appId));
                    var newRoles = new List <string>();
                    foreach (var role in rolesForUser)
                    {
                        switch (role.ToLowerInvariant())
                        {
                        case "administrators":
                            newRoles.Add("TdAdministrators");
                            break;

                        case "helpdesk":
                            newRoles.Add("TdHelpDeskUsers");
                            break;

                        case "ticketsubmitters":
                            newRoles.Add("TdInternalUsers");
                            break;

                        default:
                            newRoles.Add("TdPendingUsers");
                            break;
                        }
                    }
                    userManager.AddToRoles(newUser.Id, newRoles.ToArray());
                }
            }
            return(true);
        }
        public static void SetupDemoIdentityData(TicketDeskIdentityContext context)
        {
            var userStore = new UserStore <TicketDeskUser>(context);
            var roleStore = new RoleStore <IdentityRole>(context);
            //TODO: this user manager has a default config, need to leverage the same user manager as the rest of the application
            var userManager = new UserManager <TicketDeskUser>(userStore);

            var roleManager = new RoleManager <IdentityRole>(roleStore);

            var roleNames = context.DefaultRoleNames;

            foreach (var roleName in roleNames)
            {
                //Create Role if it does not exist
                var role = roleManager.FindByName(roleName);
                if (role == null)
                {
                    role = new IdentityRole(roleName);
                    roleManager.Create(role);
                }
            }

            var admin = new TicketDeskUser {
                Id = "64165817-9cb5-472f-8bfb-6a35ca54be6a", UserName = "******", Email = "*****@*****.**", DisplayName = "Admin User"
            };
            var staff = new TicketDeskUser {
                Id = "72bdddfb-805a-4883-94b9-aa494f5f52dc", UserName = "******", Email = "*****@*****.**", DisplayName = "HelpDesk User"
            };
            var reguser = new TicketDeskUser {
                Id = "17f78f38-fa68-445f-90de-38896140db28", UserName = "******", Email = "*****@*****.**", DisplayName = "Regular User"
            };
            var users      = new[] { admin, staff, reguser };
            var rolesNames = new Dictionary <string, string[]>
            {
                { "*****@*****.**", new[] { "TdAdministrators", "TdHelpDeskUsers", "TdInternalUsers" } },
                { "*****@*****.**", new[] { "TdHelpDeskUsers", "TdInternalUsers" } },
                { "*****@*****.**", new[] { "TdInternalUsers" } }
            };

            foreach (var tdUser in users)
            {
                var user = userManager.FindByName(tdUser.UserName);
                if (user == null)
                {
                    user = tdUser;
                    userManager.Create(user, "123456");
                    userManager.SetLockoutEnabled(user.Id, false);
                }
                var rnames       = rolesNames[user.UserName];
                var rolesForUser = userManager.GetRoles(user.Id);
                foreach (var rname in rnames.Where(rname => !rolesForUser.Contains(rname)))
                {
                    userManager.AddToRole(user.Id, rname);
                }
            }
        }
Example #8
0
        public static void SetupDemoIdentityData(TdIdentityContext context, string currentUserId)
        {
            var userStore   = new UserStore <TicketDeskUser>(context);
            var roleStore   = new RoleStore <TicketDeskRole>(context);
            var userManager = new TicketDeskUserManager(userStore);
            var roleManager = new TicketDeskRoleManager(roleStore);

            roleManager.EnsureDefaultRolesExist();


            var staff = new TicketDeskUser {
                Id = "72bdddfb-805a-4883-94b9-aa494f5f52dc", UserName = "******", Email = "*****@*****.**", DisplayName = "HelpDesk User"
            };
            var reguser = new TicketDeskUser {
                Id = "17f78f38-fa68-445f-90de-38896140db28", UserName = "******", Email = "*****@*****.**", DisplayName = "Regular User"
            };
            var users = new List <TicketDeskUser> {
                staff, reguser
            };
            var rolesNames = new Dictionary <string, string[]>
            {
                { "*****@*****.**", new[] { "TdHelpDeskUsers" } },
                { "*****@*****.**", new[] { "TdInternalUsers" } }
            };

            if (currentUserId == null && userManager.FindByName("*****@*****.**") == null)
            {
                users.Add(new TicketDeskUser
                {
                    Id          = "64165817-9cb5-472f-8bfb-6a35ca54be6a",
                    UserName    = "******",
                    Email       = "*****@*****.**",
                    DisplayName = "Admin User"
                });
                rolesNames.Add("*****@*****.**", new[] { "TdAdministrators" });
            }


            foreach (var tdUser in users)
            {
                var user = userManager.FindById(tdUser.Id);
                if (user != null)
                {
                    userManager.Delete(user);
                }
                user = tdUser;
                userManager.Create(user, "123456");

                var rnames       = rolesNames[user.UserName];
                var rolesForUser = userManager.GetRoles(user.Id);
                foreach (var rname in rnames.Where(rname => !rolesForUser.Contains(rname)))
                {
                    userManager.AddToRole(user.Id, rname);
                }
            }
        }
        public async Task <ActionResult> CreateDatabase(string email, string password, string displayName)
        {
            using (var ctx = new TdDomainContext(null))
            {
                Database.SetInitializer(
                    new MigrateDatabaseToLatestVersion <TdDomainContext, Configuration>(true));
                ctx.Database.Initialize(true);
            }



            var filter = GlobalFilters.Filters.FirstOrDefault(f => f.Instance is DbSetupFilter);

            if (filter != null)
            {
                GlobalFilters.Filters.Remove(filter.Instance);
            }

            Database.SetInitializer(new TdIdentityDbInitializer());
            var existingUser = UserManager.FindByName(email);

            if (existingUser == null)
            {
                var user = new TicketDeskUser {
                    UserName = email, Email = email, DisplayName = displayName
                };
                await UserManager.CreateAsync(user, password);

                await UserManager.AddToRoleAsync(user.Id, "TdAdministrators");
            }
            else
            {
                //should only happen if user entered one of the demo user names when setting up the DB
                //reset the password to the one the user entered here, and set the admin role if needed
                var token = await UserManager.GeneratePasswordResetTokenAsync(existingUser.Id);

                await UserManager.ResetPasswordAsync(existingUser.Id, token, password);

                existingUser.DisplayName = displayName;
                await UserManager.UpdateAsync(existingUser);

                if (!UserManager.IsTdAdministrator(existingUser.Id))
                {
                    await UserManager.AddToRoleAsync(existingUser.Id, "TdAdministrators");
                }
            }
            Database.SetInitializer(new TdPushNotificationDbInitializer());

            Startup.ConfigurePushNotifications();
            UpdateSearchIndex();
            return(RedirectToAction("Index"));
        }
        private async Task <bool> UpdateUserInfo(TicketDeskUser user, UserAccountInfoViewModel model)
        {
            user.UserName    = model.User.Email;
            user.Email       = model.User.Email;
            user.DisplayName = model.User.DisplayName;
            var result = await UserManager.UpdateAsync(user);

            if (!result.Succeeded)
            {
                AddErrors(result);
            }
            return(result.Succeeded);
        }
Example #11
0
        public async Task <ActionResult> Register(UserRegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new TicketDeskUser {
                    UserName = model.Email, Email = model.Email, DisplayName = model.DisplayName
                };
                var result = await UserManager.CreateAsync(user, model.Password);

                if (result.Succeeded)
                {
                    await SignInManager.SignInAsync(user, isPersistent : false, rememberBrowser : false);

                    await UserManager.AddToRolesAsync(user.Id, DomainContext.TicketDeskSettings.SecuritySettings.DefaultNewUserRoles.ToArray());

                    HostingEnvironment.QueueBackgroundWorkItem(ct =>
                    {
                        using
                        (
                            var notificationContext = DependencyResolver.Current.GetService <TdPushNotificationContext>()
                        )
                        {
                            notificationContext.SubscriberPushNotificationSettingsManager.AddSettingsForSubscriber(
                                new SubscriberNotificationSetting
                            {
                                SubscriberId = user.Id,
                                IsEnabled    = true,
                                PushNotificationDestinations = new[]
                                {
                                    new PushNotificationDestination()
                                    {
                                        DestinationType    = "email",
                                        DestinationAddress = user.Email,
                                        SubscriberName     = user.DisplayName
                                    }
                                }
                            });
                            notificationContext.SaveChanges();
                        }
                    });

                    return(RedirectToAction("Index", "Home"));
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return(View(model));
        }
        private async Task <bool> RemoveRoles(IEnumerable <string> roleIdsToRemove, TicketDeskUser user)
        {
            var roleNamesToRemove = RoleManager.Roles.Where(r => roleIdsToRemove.Any(ri => ri == r.Id)).Select(r => r.Name);

            if (roleNamesToRemove.Any())
            {
                var result = await UserManager.RemoveFromRolesAsync(user.Id, await roleNamesToRemove.ToArrayAsync());

                if (!result.Succeeded)
                {
                    AddErrors(result);
                }
                return(result.Succeeded);
            }
            return(true);
        }
Example #13
0
        private async Task ResetMailEmailDestination(TicketDeskUser user, string oldEmail)
        {
            var noteSettings =
                await NotificationContext.SubscriberPushNotificationSettingsManager.GetSettingsForSubscriberAsync(user.Id);

            var dest = noteSettings.PushNotificationDestinations.FirstOrDefault(
                d => d.DestinationType == "email" && d.DestinationAddress == oldEmail);

            if (dest == null)
            {
                dest = new PushNotificationDestination()
                {
                    SubscriberId = user.Id, DestinationType = "email"
                };
                noteSettings.PushNotificationDestinations.Add(dest);
            }
            dest.DestinationAddress = user.Email;
            dest.SubscriberName     = user.DisplayName;
            await NotificationContext.SaveChangesAsync();
        }
        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 TicketDeskUser {
                    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));
        }
Example #15
0
        public static void InitializeStockUsers(TdIdentityContext context)
        {
            //create the standard roles and default admin account
            var userStore = new UserStore <TicketDeskUser>(context);
            var roleStore = new RoleStore <TicketDeskRole>(context);

            var userManager = new TicketDeskUserManager(userStore);
            var roleManager = new TicketDeskRoleManager(roleStore);

            roleManager.EnsureDefaultRolesExist();


            var existingAdminRole = roleManager.FindByName("TdAdministrators");

            //only create default admin user if no other user exists with the admin role
            if (existingAdminRole != null &&
                !userManager.Users.Any(u => u.Roles.Any(r => r.RoleId == existingAdminRole.Id)))
            {
                var admin = new TicketDeskUser
                {
                    Id          = "64165817-9cb5-472f-8bfb-6a35ca54be6a",
                    UserName    = "******",
                    Email       = "*****@*****.**",
                    DisplayName = "Admin User",
                };
                if (userManager.FindById("64165817-9cb5-472f-8bfb-6a35ca54be6a") == null)
                {
                    var adminRoles = new[] { "TdAdministrators" };
                    userManager.Create(admin, "123456");

                    foreach (var rname in adminRoles)
                    {
                        userManager.AddToRole(admin.Id, rname);
                    }
                }
            }
        }