TackleMcClean 🏅
03/21/2024, 3:11 PMprivate void CreateUserIfNotExist(string email, string password, string? name)
{
var user = _userService.GetByEmail(email);
if (user != null)
{
return;
}
var newUser = _userService.CreateUserWithIdentity(name ?? email, email);
var userGroup = _userService.GetUserGroupByAlias("editors") as IReadOnlyUserGroup;
if (userGroup != null)
{
newUser.AddGroup(userGroup);
newUser.RawPasswordValue = ???? // how to hash password?
_userService.Save(newUser);
}
}
How can I figure out the RawPasswordValue
? I've tried 5 different ways of dependency inject a password hasher, but I can't find a way to type it to <IUser>
which is what CreateUserWithIdentity
returns.
The documentation has a page that brings up my hope:
https://docs.umbraco.com/umbraco-cms/reference/management/services/userservice/create-a-new-user
But it has no example shown at all, broken documentation perhaps?Sebastiaan
03/21/2024, 4:04 PM_userManager
and _globalSettings
for creating like so:
csharp
IdentityResult userCreated = await _userManager.CreateAsync(
BackOfficeIdentityUser.CreateNew(
_globalSettings,
username: "username",
email: "email@provider.ext",
culture: "en-US",
name: "Person's Name"),
password: "password"); // remember to meet password requirements
usings:
csharp
private readonly IBackOfficeUserManager _userManager;
private readonly GlobalSettings _globalSettings;
TackleMcClean 🏅
03/21/2024, 4:15 PMSebastiaan
03/21/2024, 4:16 PMcsharp
IdentityResult userCreated = _userManager.CreateAsync(
BackOfficeIdentityUser.CreateNew(
_globalSettings,
username: "username",
email: "email@provider.ext",
culture: "en-US",
name: "Person's Name"),
password: "password").Result;
Sebastiaan
03/21/2024, 4:17 PMTackleMcClean 🏅
03/21/2024, 4:19 PMSebastiaan
03/21/2024, 4:19 PMTackleMcClean 🏅
03/21/2024, 4:20 PMTackleMcClean 🏅
03/21/2024, 4:20 PMTackleMcClean 🏅
03/21/2024, 4:26 PMCannot consume scoped service 'Umbraco.Cms.Core.Security.IBackOfficeUserManager' from singleton 'cms.PrepopulateUsersComponent'
Can I only consume IBackOfficeUserManager
from non singletons, or is there a workaround?TackleMcClean 🏅
03/21/2024, 4:28 PM_serviceScopeFactory
Sebastiaan
03/21/2024, 4:29 PMGetRequiredService
so you can do GetRequiredService<IBackOfficeUserManager>
and one for globalsettings.. it's not very easy, I'm just googling this too lolSebastiaan
03/21/2024, 4:29 PMTackleMcClean 🏅
03/21/2024, 4:33 PM.Result
cheat:
https://cdn.discordapp.com/attachments/1220389358566379603/1220409940263440456/image.png?ex=660ed653&is=65fc6153&hm=0a51e5a85d8b57c44607c97981464ae70fd76f4e9ef133fa8fff6470ddc2397d&TackleMcClean 🏅
03/21/2024, 4:35 PMSebastiaan
03/21/2024, 4:35 PMSebastiaan
03/21/2024, 4:37 PMTackleMcClean 🏅
03/21/2024, 4:38 PMIBackOfficeUserManager
at that point?TackleMcClean 🏅
03/21/2024, 4:38 PMusing IServiceScope scope = _serviceScopeFactory.CreateScope();
_userManager = scope.ServiceProvider.GetRequiredService<IBackOfficeUserManager>();
TackleMcClean 🏅
03/21/2024, 4:39 PMInitialize
method instead in the startup componentSebastiaan
03/21/2024, 4:40 PMIComposer
or what?TackleMcClean 🏅
03/21/2024, 4:40 PMIComponent
TackleMcClean 🏅
03/21/2024, 4:42 PMTackleMcClean 🏅
03/21/2024, 4:43 PMInitialize
and keep reusing it for the user creation. Seems to work just fine from what I can tell. 💃
🙏Sebastiaan
03/21/2024, 4:47 PMcsharp
using IScope scope = _scopeProvider.CreateScope();
// Existing code
scope.Complete();
Sebastiaan
03/21/2024, 4:47 PMGetRequiredService
right?Sebastiaan
03/21/2024, 4:47 PMTackleMcClean 🏅
03/21/2024, 4:58 PMTackleMcClean 🏅
03/21/2024, 4:59 PMIServiceScope
instead of an IScope
currently, I suppose the .Dispose()
method is equivalentTackleMcClean 🏅
03/21/2024, 5:01 PMu.IsApproved = true;
👍Sebastiaan
03/22/2024, 9:51 AMTackleMcClean 🏅
03/28/2024, 7:53 AMPrepopulateUsers
with an array of Name, Email and Passwords.
In a RegisterStartupComponents
I check if this key is populated, in that case a PrepopulateUsersComponent
is ran.
Initialize method of that component:
public void Initialize()
{
var userListRequest = _config.GetSection("PrepopulateUsers").GetChildren();
using IServiceScope scope = _serviceScopeFactory.CreateScope();
var userManager = scope.ServiceProvider.GetRequiredService<IBackOfficeUserManager>();
foreach (var userRequest in userListRequest)
{
var name = userRequest["name"];
var email = userRequest["email"];
var password = userRequest["password"];
if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password))
{
continue;
}
CreateUserIfNotExist(userManager, email, password, name);
}
scope.Dispose();
}
TackleMcClean 🏅
03/28/2024, 7:54 AMprivate void CreateUserIfNotExist(IBackOfficeUserManager userManager, string email, string password, string? name)
{
var userGroup = _userService.GetUserGroupByAlias("editor") as IReadOnlyUserGroup;
if (userGroup != null)
{
var existingUser = _userService.GetByEmail(email);
if (existingUser != null)
{
return;
}
var identity = BackOfficeIdentityUser.CreateNew(
_globalSettings,
username: email,
email: email,
culture: "sv-SE",
name: name
);
var userCreated = userManager.CreateAsync(identity, password: password).Result;
var user = _userService.GetByEmail(email);
if (user != null)
{
// Add the user to the group
user.AddGroup(userGroup);
user.IsApproved = true;
_userService.Save(user);
}
}
}
TackleMcClean 🏅
03/28/2024, 7:55 AM