consolidate user creation

This commit is contained in:
Shaun Walker 2022-03-24 12:32:41 -04:00
parent 50a44c9416
commit 79f427e10a
7 changed files with 137 additions and 143 deletions

View File

@ -90,9 +90,10 @@ else
{ {
SiteId = PageState.Site.SiteId, SiteId = PageState.Site.SiteId,
Username = _username, Username = _username,
DisplayName = (_displayname == string.Empty ? _username : _displayname), Password = _password,
Email = _email, Email = _email,
Password = _password DisplayName = (_displayname == string.Empty ? _username : _displayname),
PhotoFileId = null
}; };
user = await UserService.AddUserAsync(user); user = await UserService.AddUserAsync(user);

View File

@ -162,6 +162,7 @@ namespace Oqtane.Controllers
if (allowregistration) if (allowregistration)
{ {
bool succeeded;
IdentityUser identityuser = await _identityUserManager.FindByNameAsync(user.Username); IdentityUser identityuser = await _identityUserManager.FindByNameAsync(user.Username);
if (identityuser == null) if (identityuser == null)
{ {
@ -170,74 +171,48 @@ namespace Oqtane.Controllers
identityuser.Email = user.Email; identityuser.Email = user.Email;
identityuser.EmailConfirmed = verified; identityuser.EmailConfirmed = verified;
var result = await _identityUserManager.CreateAsync(identityuser, user.Password); var result = await _identityUserManager.CreateAsync(identityuser, user.Password);
if (result.Succeeded) succeeded = result.Succeeded;
{
user.LastLoginOn = null;
user.LastIPAddress = "";
newUser = _users.AddUser(user);
if (!verified)
{
string token = await _identityUserManager.GenerateEmailConfirmationTokenAsync(identityuser);
string url = HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name + "/login?name=" + user.Username + "&token=" + WebUtility.UrlEncode(token);
string body = "Dear " + user.DisplayName + ",\n\nIn Order To Complete The Registration Of Your User Account Please Click The Link Displayed Below:\n\n" + url + "\n\nThank You!";
var notification = new Notification(user.SiteId, newUser, "User Account Verification", body);
_notifications.AddNotification(notification);
}
// add folder for user
Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users",Path.DirectorySeparatorChar.ToString()));
if (folder != null)
{
_folders.AddFolder(new Folder
{
SiteId = folder.SiteId,
ParentId = folder.FolderId,
Name = "My Folder",
Type = FolderTypes.Private,
Path = Utilities.PathCombine(folder.Path, newUser.UserId.ToString(), Path.DirectorySeparatorChar.ToString()),
Order = 1,
ImageSizes = "",
Capacity = Constants.UserFolderCapacity,
IsSystem = true,
Permissions = new List<Permission>
{
new Permission(PermissionNames.Browse, newUser.UserId, true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, newUser.UserId, true)
}.EncodePermissions()
}) ;
}
}
} }
else else
{ {
var result = await _identitySignInManager.CheckPasswordSignInAsync(identityuser, user.Password, false); var result = await _identitySignInManager.CheckPasswordSignInAsync(identityuser, user.Password, false);
if (result.Succeeded) succeeded = result.Succeeded;
{ verified = true;
newUser = _users.GetUser(user.Username); }
}
if (succeeded)
{
user.LastLoginOn = null;
user.LastIPAddress = "";
newUser = _users.AddUser(user);
} }
if (newUser != null) if (newUser != null)
{ {
// add auto assigned roles to user for site if (!verified)
List<Role> roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList();
foreach (Role role in roles)
{ {
UserRole userrole = new UserRole(); string token = await _identityUserManager.GenerateEmailConfirmationTokenAsync(identityuser);
userrole.UserId = newUser.UserId; string url = HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name + "/login?name=" + user.Username + "&token=" + WebUtility.UrlEncode(token);
userrole.RoleId = role.RoleId; string body = "Dear " + user.DisplayName + ",\n\nIn Order To Complete The Registration Of Your User Account Please Click The Link Displayed Below:\n\n" + url + "\n\nThank You!";
userrole.EffectiveDate = null; var notification = new Notification(user.SiteId, newUser, "User Account Verification", body);
userrole.ExpiryDate = null; _notifications.AddNotification(notification);
_userRoles.AddUserRole(userrole); }
else
{
string url = HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name;
string body = "Dear " + user.DisplayName + ",\n\nA User Account Has Been Succesfully Created For You. Please Use The Following Link To Access The Site:\n\n" + url + "\n\nThank You!";
var notification = new Notification(user.SiteId, newUser, "User Account Notification", body);
_notifications.AddNotification(notification);
} }
}
if (newUser != null)
{
newUser.Password = ""; // remove sensitive information newUser.Password = ""; // remove sensitive information
_logger.Log(user.SiteId, LogLevel.Information, this, LogFunction.Create, "User Added {User}", newUser); _logger.Log(user.SiteId, LogLevel.Information, this, LogFunction.Create, "User Added {User}", newUser);
} }
else
{
user.Password = ""; // remove sensitive information
_logger.Log(user.SiteId, LogLevel.Error, this, LogFunction.Create, "Unable To Add User {User}", user);
}
} }
else else
{ {

View File

@ -73,13 +73,6 @@ namespace Oqtane.Controllers
var role = _roles.GetRole(userRole.RoleId); var role = _roles.GetRole(userRole.RoleId);
if (ModelState.IsValid && role != null && SiteValid(role.SiteId) && RoleValid(role.Name)) if (ModelState.IsValid && role != null && SiteValid(role.SiteId) && RoleValid(role.Name))
{ {
if (role.Name == RoleNames.Host)
{
// host roles can only exist at global level - remove all site specific user roles
_userRoles.DeleteUserRoles(userRole.UserId);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Roles Deleted For UserId {UserId}", userRole.UserId);
}
userRole = _userRoles.AddUserRole(userRole); userRole = _userRoles.AddUserRole(userRole);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "User Role Added {UserRole}", userRole); _logger.Log(LogLevel.Information, this, LogFunction.Create, "User Role Added {UserRole}", userRole);

View File

@ -210,60 +210,43 @@ namespace Oqtane.Extensions
var result = await _identityUserManager.CreateAsync(identityuser, DateTime.UtcNow.ToString("yyyy-MMM-dd-HH-mm-ss")); var result = await _identityUserManager.CreateAsync(identityuser, DateTime.UtcNow.ToString("yyyy-MMM-dd-HH-mm-ss"));
if (result.Succeeded) if (result.Succeeded)
{ {
// add user login user = new User
await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); {
SiteId = alias.SiteId,
user = new User(); Username = email,
user.SiteId = alias.SiteId; DisplayName = email,
user.Username = email; Email = email,
user.DisplayName = email; LastLoginOn = null,
user.Email = email; LastIPAddress = ""
user.LastLoginOn = null; };
user.LastIPAddress = "";
user = _users.AddUser(user); user = _users.AddUser(user);
// add folder for user if (user != null)
var _folders = httpContext.RequestServices.GetRequiredService<IFolderRepository>();
Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString()));
if (folder != null)
{ {
_folders.AddFolder(new Folder var _notifications = httpContext.RequestServices.GetRequiredService<INotificationRepository>();
{ string url = httpContext.Request.Scheme + "://" + alias.Name;
SiteId = folder.SiteId, string body = "You Recently Used An External Account To Sign In To Our Site.\n\n" + url + "\n\nThank You!";
ParentId = folder.FolderId, var notification = new Notification(user.SiteId, user, "User Account Notification", body);
Name = "My Folder", _notifications.AddNotification(notification);
Type = FolderTypes.Private,
Path = Utilities.PathCombine(folder.Path, user.UserId.ToString(), Path.DirectorySeparatorChar.ToString()),
Order = 1,
ImageSizes = "",
Capacity = Constants.UserFolderCapacity,
IsSystem = true,
Permissions = new List<Permission>
{
new Permission(PermissionNames.Browse, user.UserId, true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, user.UserId, true)
}.EncodePermissions()
});
}
// add auto assigned roles to user for site // add user login
var _roles = httpContext.RequestServices.GetRequiredService<IRoleRepository>(); await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, ""));
List<Role> roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList();
foreach (Role role in roles) _logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "User Added {User}", user);
{
UserRole userrole = new UserRole();
userrole.UserId = user.UserId;
userrole.RoleId = role.RoleId;
userrole.EffectiveDate = null;
userrole.ExpiryDate = null;
_userRoles.AddUserRole(userrole);
} }
else
{
_logger.Log(user.SiteId, LogLevel.Error, "ExternalLogin", Enums.LogFunction.Create, "Unable To Add User {Email}", email);
}
}
else
{
_logger.Log(user.SiteId, LogLevel.Error, "ExternalLogin", Enums.LogFunction.Create, "Unable To Add Identity User {Email} {Error}", email, result.Errors.ToString());
} }
} }
else else
{ {
_logger.Log(LogLevel.Error, "ExternalLogin", Enums.LogFunction.Security, "Creation Of New Users Is Disabled. User With Email Address {Email} Will First Need To Be Registered On The Site.", email); _logger.Log(LogLevel.Error, "ExternalLogin", Enums.LogFunction.Security, "Creation Of New Users Is Disabled For This Site. User With Email Address {Email} Will First Need To Be Registered On The Site.", email);
} }
} }
else else
@ -287,24 +270,25 @@ namespace Oqtane.Extensions
// add user login // add user login
await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, ""));
user = _users.GetUser(identityuser.UserName); user = _users.GetUser(identityuser.UserName);
_logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "External User Login Added For {Email} Using Provider {Provider}", email, providerType);
} }
} }
// add claims to principal // add claims to principal
if (user != null) if (user != null)
{ {
// update user
user.LastLoginOn = DateTime.UtcNow;
user.LastIPAddress = httpContext.Connection.RemoteIpAddress.ToString();
_users.UpdateUser(user);
_logger.Log(LogLevel.Information, "ExternalLogin", Enums.LogFunction.Security, "User Login Successful For {Username} Using Provider {Provider}", user.Username, providerType);
// add Oqtane claims // add Oqtane claims
var principal = (ClaimsIdentity)claimsPrincipal.Identity; var principal = (ClaimsIdentity)claimsPrincipal.Identity;
UserSecurity.ResetClaimsIdentity(principal); UserSecurity.ResetClaimsIdentity(principal);
List<UserRole> userroles = _userRoles.GetUserRoles(user.UserId, user.SiteId).ToList(); List<UserRole> userroles = _userRoles.GetUserRoles(user.UserId, user.SiteId).ToList();
var identity = UserSecurity.CreateClaimsIdentity(alias, user, userroles); var identity = UserSecurity.CreateClaimsIdentity(alias, user, userroles);
principal.AddClaims(identity.Claims); principal.AddClaims(identity.Claims);
// update user
user.LastLoginOn = DateTime.UtcNow;
user.LastIPAddress = httpContext.Connection.RemoteIpAddress.ToString();
_users.UpdateUser(user);
_logger.Log(LogLevel.Information, "ExternalLogin", Enums.LogFunction.Security, "External User Login Successful For {Username} Using Provider {Provider}", user.Username, providerType);
} }
else // user not logged in else // user not logged in
{ {

View File

@ -620,35 +620,12 @@ namespace Oqtane.Infrastructure
LastIPAddress = "", LastIPAddress = "",
LastLoginOn = null LastLoginOn = null
}; };
user = users.AddUser(user); user = users.AddUser(user);
// add host role
var hostRoleId = roles.GetRoles(user.SiteId, true).FirstOrDefault(item => item.Name == RoleNames.Host)?.RoleId ?? 0; var hostRoleId = roles.GetRoles(user.SiteId, true).FirstOrDefault(item => item.Name == RoleNames.Host)?.RoleId ?? 0;
var userRole = new UserRole { UserId = user.UserId, RoleId = hostRoleId, EffectiveDate = null, ExpiryDate = null }; var userRole = new UserRole { UserId = user.UserId, RoleId = hostRoleId, EffectiveDate = null, ExpiryDate = null };
userRoles.AddUserRole(userRole); userRoles.AddUserRole(userRole);
// add user folder
var folder = folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString()));
if (folder != null)
{
folders.AddFolder(new Folder
{
SiteId = folder.SiteId,
ParentId = folder.FolderId,
Name = "My Folder",
Type = FolderTypes.Private,
Path = Utilities.PathCombine(folder.Path, user.UserId.ToString(), Path.DirectorySeparatorChar.ToString()),
Order = 1,
ImageSizes = "",
Capacity = Constants.UserFolderCapacity,
IsSystem = true,
Permissions = new List<Permission>
{
new Permission(PermissionNames.Browse, user.UserId, true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, user.UserId, true),
}.EncodePermissions(),
});
}
} }
} }
} }

View File

@ -1,17 +1,26 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Oqtane.Extensions;
using Oqtane.Models; using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Repository namespace Oqtane.Repository
{ {
public class UserRepository : IUserRepository public class UserRepository : IUserRepository
{ {
private TenantDBContext _db; private TenantDBContext _db;
private readonly IFolderRepository _folders;
private readonly IRoleRepository _roles;
private readonly IUserRoleRepository _userroles;
public UserRepository(TenantDBContext context) public UserRepository(TenantDBContext context, IFolderRepository folders, IRoleRepository roles, IUserRoleRepository userroles)
{ {
_db = context; _db = context;
_folders = folders;
_roles = roles;
_userroles = userroles;
} }
public IEnumerable<User> GetUsers() public IEnumerable<User> GetUsers()
@ -21,8 +30,52 @@ namespace Oqtane.Repository
public User AddUser(User user) public User AddUser(User user)
{ {
_db.User.Add(user); if (_db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null)
_db.SaveChanges(); {
_db.User.Add(user);
_db.SaveChanges();
}
else
{
user = _db.User.AsNoTracking().First(item => item.Username == user.Username);
}
// add folder for user
Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString()));
if (folder != null)
{
_folders.AddFolder(new Folder
{
SiteId = folder.SiteId,
ParentId = folder.FolderId,
Name = "My Folder",
Type = FolderTypes.Private,
Path = Utilities.PathCombine(folder.Path, user.UserId.ToString(), Path.DirectorySeparatorChar.ToString()),
Order = 1,
ImageSizes = "",
Capacity = Constants.UserFolderCapacity,
IsSystem = true,
Permissions = new List<Permission>
{
new Permission(PermissionNames.Browse, user.UserId, true),
new Permission(PermissionNames.View, RoleNames.Everyone, true),
new Permission(PermissionNames.Edit, user.UserId, true)
}.EncodePermissions()
});
}
// add auto assigned roles to user for site
List<Role> roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList();
foreach (Role role in roles)
{
UserRole userrole = new UserRole();
userrole.UserId = user.UserId;
userrole.RoleId = role.RoleId;
userrole.EffectiveDate = null;
userrole.ExpiryDate = null;
_userroles.AddUserRole(userrole);
}
return user; return user;
} }

View File

@ -2,16 +2,19 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Oqtane.Models; using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Repository namespace Oqtane.Repository
{ {
public class UserRoleRepository : IUserRoleRepository public class UserRoleRepository : IUserRoleRepository
{ {
private TenantDBContext _db; private TenantDBContext _db;
private readonly IRoleRepository _roles;
public UserRoleRepository(TenantDBContext context) public UserRoleRepository(TenantDBContext context, IRoleRepository roles)
{ {
_db = context; _db = context;
_roles = roles;
} }
public IEnumerable<UserRole> GetUserRoles(int siteId) public IEnumerable<UserRole> GetUserRoles(int siteId)
@ -34,6 +37,14 @@ namespace Oqtane.Repository
{ {
_db.UserRole.Add(userRole); _db.UserRole.Add(userRole);
_db.SaveChanges(); _db.SaveChanges();
// host roles can only exist at global level - remove any site specific user roles
var role = _roles.GetRole(userRole.RoleId);
if (role.Name == RoleNames.Host)
{
DeleteUserRoles(userRole.UserId);
}
return userRole; return userRole;
} }