| @ -90,9 +90,10 @@ else | ||||
|                         { | ||||
|                             SiteId = PageState.Site.SiteId, | ||||
|                             Username = _username, | ||||
|                             DisplayName = (_displayname == string.Empty ? _username : _displayname), | ||||
|                             Password = _password, | ||||
|                             Email = _email, | ||||
|                             Password = _password | ||||
|                             DisplayName = (_displayname == string.Empty ? _username : _displayname), | ||||
| 							PhotoFileId = null | ||||
|                         }; | ||||
|                         user = await UserService.AddUserAsync(user); | ||||
|  | ||||
|  | ||||
| @ -162,6 +162,7 @@ namespace Oqtane.Controllers | ||||
|  | ||||
|             if (allowregistration) | ||||
|             { | ||||
|                 bool succeeded; | ||||
|                 IdentityUser identityuser = await _identityUserManager.FindByNameAsync(user.Username); | ||||
|                 if (identityuser == null) | ||||
|                 { | ||||
| @ -170,74 +171,48 @@ namespace Oqtane.Controllers | ||||
|                     identityuser.Email = user.Email; | ||||
|                     identityuser.EmailConfirmed = verified; | ||||
|                     var result = await _identityUserManager.CreateAsync(identityuser, user.Password); | ||||
|                     if (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() | ||||
|                             }) ; | ||||
|                         } | ||||
|                     } | ||||
|                     succeeded = result.Succeeded; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     var result = await _identitySignInManager.CheckPasswordSignInAsync(identityuser, user.Password, false); | ||||
|                     if (result.Succeeded) | ||||
|                     { | ||||
|                         newUser = _users.GetUser(user.Username); | ||||
|                     } | ||||
|                     succeeded = result.Succeeded; | ||||
|                     verified = true; | ||||
|                 } | ||||
|  | ||||
|                 if (succeeded) | ||||
|                 { | ||||
|                     user.LastLoginOn = null; | ||||
|                     user.LastIPAddress = ""; | ||||
|                     newUser = _users.AddUser(user); | ||||
|                 } | ||||
|  | ||||
|                 if (newUser != null) | ||||
|                 { | ||||
|                     // 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) | ||||
|                     if (!verified) | ||||
|                     { | ||||
|                         UserRole userrole = new UserRole(); | ||||
|                         userrole.UserId = newUser.UserId; | ||||
|                         userrole.RoleId = role.RoleId; | ||||
|                         userrole.EffectiveDate = null; | ||||
|                         userrole.ExpiryDate = null; | ||||
|                         _userRoles.AddUserRole(userrole); | ||||
|                         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); | ||||
|                     } | ||||
|                     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 | ||||
|                     _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 | ||||
|             { | ||||
|  | ||||
| @ -73,13 +73,6 @@ namespace Oqtane.Controllers | ||||
|             var role = _roles.GetRole(userRole.RoleId); | ||||
|             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); | ||||
|                 _logger.Log(LogLevel.Information, this, LogFunction.Create, "User Role Added {UserRole}", userRole); | ||||
|  | ||||
|  | ||||
| @ -210,60 +210,43 @@ namespace Oqtane.Extensions | ||||
|                         var result = await _identityUserManager.CreateAsync(identityuser, DateTime.UtcNow.ToString("yyyy-MMM-dd-HH-mm-ss")); | ||||
|                         if (result.Succeeded) | ||||
|                         { | ||||
|                             // add user login | ||||
|                             await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); | ||||
|  | ||||
|                             user = new User(); | ||||
|                             user.SiteId = alias.SiteId; | ||||
|                             user.Username = email; | ||||
|                             user.DisplayName = email; | ||||
|                             user.Email = email; | ||||
|                             user.LastLoginOn = null; | ||||
|                             user.LastIPAddress = ""; | ||||
|                             user = new User | ||||
|                             { | ||||
|                                 SiteId = alias.SiteId, | ||||
|                                 Username = email, | ||||
|                                 DisplayName = email, | ||||
|                                 Email = email, | ||||
|                                 LastLoginOn = null, | ||||
|                                 LastIPAddress = "" | ||||
|                             }; | ||||
|                             user = _users.AddUser(user); | ||||
|  | ||||
|                             // add folder for user | ||||
|                             var _folders = httpContext.RequestServices.GetRequiredService<IFolderRepository>(); | ||||
|                             Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString())); | ||||
|                             if (folder != null) | ||||
|                             if (user != 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() | ||||
|                                 }); | ||||
|                             } | ||||
|                                 var _notifications = httpContext.RequestServices.GetRequiredService<INotificationRepository>(); | ||||
|                                 string url = httpContext.Request.Scheme + "://" + alias.Name; | ||||
|                                 string body = "You Recently Used An External Account To Sign In To Our Site.\n\n" + url + "\n\nThank You!"; | ||||
|                                 var notification = new Notification(user.SiteId, user, "User Account Notification", body); | ||||
|                                 _notifications.AddNotification(notification); | ||||
|  | ||||
|                             // add auto assigned roles to user for site | ||||
|                             var _roles = httpContext.RequestServices.GetRequiredService<IRoleRepository>(); | ||||
|                             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); | ||||
|                                 // add user login | ||||
|                                 await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); | ||||
|  | ||||
|                                 _logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "User Added {User}", user); | ||||
|                             } | ||||
|                             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 | ||||
|                     { | ||||
|                         _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 | ||||
| @ -287,24 +270,25 @@ namespace Oqtane.Extensions | ||||
|                         // add user login | ||||
|                         await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); | ||||
|                         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 | ||||
|                 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 | ||||
|                     var principal = (ClaimsIdentity)claimsPrincipal.Identity; | ||||
|                     UserSecurity.ResetClaimsIdentity(principal); | ||||
|                     List<UserRole> userroles = _userRoles.GetUserRoles(user.UserId, user.SiteId).ToList(); | ||||
|                     var identity = UserSecurity.CreateClaimsIdentity(alias, user, userroles); | ||||
|                     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 | ||||
|                 { | ||||
|  | ||||
| @ -620,35 +620,12 @@ namespace Oqtane.Infrastructure | ||||
|                                             LastIPAddress = "", | ||||
|                                             LastLoginOn = null | ||||
|                                         }; | ||||
|  | ||||
|                                         user = users.AddUser(user); | ||||
|  | ||||
|                                         // add host role | ||||
|                                         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 }; | ||||
|                                         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(), | ||||
|                                             }); | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|  | ||||
| @ -1,17 +1,26 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Oqtane.Extensions; | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Repository | ||||
| { | ||||
|     public class UserRepository : IUserRepository | ||||
|     { | ||||
|         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; | ||||
|             _folders = folders; | ||||
|             _roles = roles; | ||||
|             _userroles = userroles; | ||||
|         } | ||||
|              | ||||
|         public IEnumerable<User> GetUsers() | ||||
| @ -21,8 +30,52 @@ namespace Oqtane.Repository | ||||
|  | ||||
|         public User AddUser(User user) | ||||
|         { | ||||
|             _db.User.Add(user); | ||||
|             _db.SaveChanges(); | ||||
|             if (_db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null) | ||||
|             { | ||||
|                 _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; | ||||
|         } | ||||
|  | ||||
|  | ||||
| @ -2,16 +2,19 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Oqtane.Models; | ||||
| using Oqtane.Shared; | ||||
|  | ||||
| namespace Oqtane.Repository | ||||
| { | ||||
|     public class UserRoleRepository : IUserRoleRepository | ||||
|     { | ||||
|         private TenantDBContext _db; | ||||
|         private readonly IRoleRepository _roles; | ||||
|  | ||||
|         public UserRoleRepository(TenantDBContext context) | ||||
|         public UserRoleRepository(TenantDBContext context, IRoleRepository roles) | ||||
|         { | ||||
|             _db = context; | ||||
|             _roles = roles; | ||||
|         } | ||||
|  | ||||
|         public IEnumerable<UserRole> GetUserRoles(int siteId) | ||||
| @ -34,6 +37,14 @@ namespace Oqtane.Repository | ||||
|         { | ||||
|             _db.UserRole.Add(userRole); | ||||
|             _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; | ||||
|         } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Shaun Walker
					Shaun Walker