Create Episerver admin user by code
After installing an Alloy site I forgot the username and password to login to Episerver and creating a local user and adding it to the Administrators group did not work for me. Maybe someone can tell me how that should work and be done!?
The old fashion way to create an Episerver user is described here:
But that does not work in CMS 10 or 11 so I decided to write some code to create a user in CMS 11 and ended up with this:
[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class EpiserverInitialization : IInitializableModule
{
private static readonly string[] _roles = { "WebAdmins", "WebEditors" };
public void Initialize(InitializationEngine context)
{
using (UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(new ApplicationDbContext<ApplicationUser>("EPiServerDB")))
{
//If there's already a user, then we don't need a seed
if (!store.Users.Any(x => x.UserName == "sysadmin"))
{
var createdUser = CreateUser(store, "sysadmin", "p@ssword", "sysadmin@mysite.com");
AddUserToRoles(store, createdUser, _roles);
store.UpdateAsync(createdUser).GetAwaiter().GetResult();
}
}
}
private ApplicationUser CreateUser(UserStore<ApplicationUser> store, string username, string password, string email)
{
//We know that this Password hasher is used as it's configured
IPasswordHasher hasher = new PasswordHasher();
string passwordHash = hasher.HashPassword(password);
ApplicationUser applicationUser = new ApplicationUser
{
Email = email,
EmailConfirmed = true,
LockoutEnabled = true,
IsApproved = true,
UserName = username,
PasswordHash = passwordHash,
SecurityStamp = Guid.NewGuid().ToString()
};
store.CreateAsync(applicationUser).GetAwaiter().GetResult();
//Get the user associated with our username
ApplicationUser createdUser = store.FindByNameAsync(username).GetAwaiter().GetResult();
return createdUser;
}
private void AddUserToRoles(UserStore<ApplicationUser> store, ApplicationUser user, string[] roles)
{
IUserRoleStore<ApplicationUser, string> userRoleStore = store;
using (var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext<ApplicationUser>("EPiServerDB")))
{
IList<string> userRoles = userRoleStore.GetRolesAsync(user).GetAwaiter().GetResult();
foreach (string roleName in roles)
{
if (roleStore.FindByNameAsync(roleName).GetAwaiter().GetResult() == null)
{
roleStore.CreateAsync(new IdentityRole { Name = roleName }).GetAwaiter().GetResult();
}
if (!userRoles.Contains(roleName))
userRoleStore.AddToRoleAsync(user, roleName).GetAwaiter().GetResult();
}
}
}
public void Uninitialize(InitializationEngine context)
{
}
public void Preload(string[] parameters)
{
}
}
After this code is run I can login with the created sysadmin user.
/Kristoffer
Thanks for the updated version!
I would like to suggest here that, the simple password that do not meet the minimum level of security (like we need one caps and one small letter and numeric and special character. for example "password") will not be accepted as password and you will not be able to figure out the issue that why you are not able to login even entering the correct username and password.
I just faced the issue. Therefore, try to follow the security parameters. (example "Simple123#")
Thanks for blog, best regards
Praful Jangid
I made a quick and dirty upgrade to CMS 12:
Thanks for sharing Kevin, this saved my day.
Again, thanks to Kristoffer too.