From 12c73decd0f5ff63fe8789374448125189302715 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 2 Oct 2019 14:43:40 -0400 Subject: [PATCH] User management improvements --- .../Modules/Admin/Pages/Delete.razor | 2 - .../Modules/Admin/Profile/Index.razor | 31 ++-- .../Modules/Admin/Register/Index.razor | 47 +++-- Oqtane.Client/Modules/Admin/Sites/Add.razor | 2 +- .../Modules/Admin/Sites/Delete.razor | 89 ++++++++++ Oqtane.Client/Modules/Admin/Sites/Edit.razor | 95 ++++++++++ Oqtane.Client/Modules/Admin/Users/Add.razor | 39 ++-- .../Modules/Admin/Users/Delete.razor | 20 ++- Oqtane.Client/Modules/Admin/Users/Edit.razor | 32 ++-- Oqtane.Client/Modules/Admin/Users/Index.razor | 2 + Oqtane.Client/Modules/Admin/Users/Roles.razor | 168 ++++++++++++++++++ Oqtane.Client/Modules/Controls/Pager.razor | 2 +- Oqtane.Client/Services/UserService.cs | 9 +- Oqtane.Client/Shared/Installer.razor | 31 ++-- Oqtane.Server/Controllers/UserController.cs | 23 +-- Oqtane.Server/Pages/Login.cshtml.cs | 5 + Oqtane.Server/Pages/Logout.cshtml.cs | 5 + Oqtane.Server/Repository/SiteRepository.cs | 13 +- 18 files changed, 533 insertions(+), 82 deletions(-) create mode 100644 Oqtane.Client/Modules/Admin/Sites/Delete.razor create mode 100644 Oqtane.Client/Modules/Admin/Sites/Edit.razor create mode 100644 Oqtane.Client/Modules/Admin/Users/Roles.razor diff --git a/Oqtane.Client/Modules/Admin/Pages/Delete.razor b/Oqtane.Client/Modules/Admin/Pages/Delete.razor index aaeb5e63..5dff05a2 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Delete.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Delete.razor @@ -135,8 +135,6 @@ DateTime? deletedon; string isdeleted; - PermissionGrid permissiongrid; - protected override void OnInitialized() { try diff --git a/Oqtane.Client/Modules/Admin/Profile/Index.razor b/Oqtane.Client/Modules/Admin/Profile/Index.razor index fbee5093..a6180677 100644 --- a/Oqtane.Client/Modules/Admin/Profile/Index.razor +++ b/Oqtane.Client/Modules/Admin/Profile/Index.razor @@ -10,10 +10,18 @@ + + + + @@ -26,10 +34,10 @@ @@ -64,9 +72,10 @@ @code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.View; } } - string displayname = ""; - string email = ""; + string username = ""; string password = ""; + string email = ""; + string displayname = ""; List profiles; Dictionary settings; string category = ""; @@ -77,8 +86,9 @@ { if (PageState.User != null) { - displayname = PageState.User.DisplayName; + username = PageState.User.Username; email = PageState.User.Email; + displayname = PageState.User.DisplayName; profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId); settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); } @@ -103,13 +113,14 @@ try { User user = PageState.User; - user.DisplayName = displayname; - user.Email = email; + user.Username = username; user.Password = password; + user.Email = email; + user.DisplayName = displayname; await UserService.UpdateUserAsync(user); await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); - NavigationManager.NavigateTo(""); + NavigationManager.NavigateTo(NavigateUrl("")); } catch (Exception ex) { diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index caceddfc..cf56cc10 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -5,12 +5,16 @@
- - + +
- + +
+
+ +
@@ -19,23 +23,38 @@ @code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Anonymous; } } - public string Email { get; set; } = ""; - public string Password { get; set; } = ""; + string Username = ""; + string Password = ""; + string Email = ""; private async Task RegisterUser() { - User user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = Email; - user.DisplayName = Email; - user.Email = Email; - user.Password = Password; - await UserService.AddUserAsync(user); - NavigationManager.NavigateTo(""); + try + { + if (Username != "" && Password != "" && Email != "") + { + User user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = Username; + user.DisplayName = Username; + user.Email = Email; + user.Password = Password; + await UserService.AddUserAsync(user); + NavigationManager.NavigateTo(NavigateUrl("")); + } + else + { + ModuleInstance.AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning); + } + } + catch (Exception ex) + { + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); + } } private void Cancel() { - NavigationManager.NavigateTo(NavigateUrl("")); // navigate to home + NavigationManager.NavigateTo(NavigateUrl("")); } } diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 159753a3..2f1b447f 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -121,6 +121,6 @@ else alias.SiteId = site.SiteId; await AliasService.AddAliasAsync(alias); - NavigationManager.NavigateTo(url, true); + NavigationManager.NavigateTo("http://" + url, true); } } diff --git a/Oqtane.Client/Modules/Admin/Sites/Delete.razor b/Oqtane.Client/Modules/Admin/Sites/Delete.razor new file mode 100644 index 00000000..f57f6e00 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Sites/Delete.razor @@ -0,0 +1,89 @@ +@namespace Oqtane.Modules.Admin.Sites +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject ISiteService SiteService +@inject IThemeService ThemeService + +@if (themes == null) +{ +

Loading...

+} +else +{ +
- + - + +
+ + +
- + - +
+ + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + Cancel +} + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } + + Dictionary themes = new Dictionary(); + Dictionary panelayouts = new Dictionary(); + + string name = ""; + string logo = ""; + string themetype; + string layouttype; + + protected override void OnInitialized() + { + themes = ThemeService.GetThemeTypes(PageState.Themes); + panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); + name = PageState.Site.Name; + logo = PageState.Site.Logo; + themetype = PageState.Site.DefaultThemeType; + layouttype = PageState.Site.DefaultLayoutType; + } + + private async Task DeleteSite() + { + await SiteService.DeleteSiteAsync(PageState.Site.SiteId); + NavigationManager.NavigateTo(NavigateUrl()); + } +} diff --git a/Oqtane.Client/Modules/Admin/Sites/Edit.razor b/Oqtane.Client/Modules/Admin/Sites/Edit.razor new file mode 100644 index 00000000..6ad50046 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Sites/Edit.razor @@ -0,0 +1,95 @@ +@namespace Oqtane.Modules.Admin.Sites +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject ISiteService SiteService +@inject IThemeService ThemeService + +@if (themes == null) +{ +

Loading...

+} +else +{ + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + Cancel +} + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } + + Dictionary themes = new Dictionary(); + Dictionary panelayouts = new Dictionary(); + + string name = ""; + string logo = ""; + string themetype; + string layouttype; + + protected override void OnInitialized() + { + themes = ThemeService.GetThemeTypes(PageState.Themes); + panelayouts = ThemeService.GetPaneLayoutTypes(PageState.Themes); + name = PageState.Site.Name; + logo = PageState.Site.Logo; + themetype = PageState.Site.DefaultThemeType; + layouttype = PageState.Site.DefaultLayoutType; + } + + private async Task SaveSite() + { + Site site = PageState.Site; + site.Name = name; + site.Logo = (logo == null ? "" : logo); + site.DefaultThemeType = themetype; + site.DefaultLayoutType = (layouttype == null ? "" : layouttype); + site = await SiteService.UpdateSiteAsync(site); + + NavigationManager.NavigateTo(NavigateUrl()); + } +} diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index 140780bc..587eb406 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -10,10 +10,18 @@ + + + + @@ -26,10 +34,10 @@ @@ -62,9 +70,10 @@ @code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } - string displayname = ""; - string email = ""; + string username = ""; string password = ""; + string email = ""; + string displayname = ""; List profiles; Dictionary settings; string category = ""; @@ -87,13 +96,21 @@ try { User user = new User(); - user.DisplayName = displayname; - user.Email = email; + user.SiteId = PageState.Site.SiteId; + user.Username = username; user.Password = password; + user.Email = email; + user.DisplayName = displayname; user = await UserService.AddUserAsync(user); - await SettingService.UpdateUserSettingsAsync(settings, user.UserId); - - NavigationManager.NavigateTo(NavigateUrl()); + if (user != null) + { + await SettingService.UpdateUserSettingsAsync(settings, user.UserId); + NavigationManager.NavigateTo(NavigateUrl()); + } + else + { + ModuleInstance.AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error); + } } catch (Exception ex) { diff --git a/Oqtane.Client/Modules/Admin/Users/Delete.razor b/Oqtane.Client/Modules/Admin/Users/Delete.razor index bbd65a9b..7bdef31d 100644 --- a/Oqtane.Client/Modules/Admin/Users/Delete.razor +++ b/Oqtane.Client/Modules/Admin/Users/Delete.razor @@ -10,10 +10,10 @@
- + - + +
+ + +
- + - +
@@ -24,6 +24,14 @@ + + + + @foreach (Profile profile in profiles) { @@ -42,7 +50,7 @@ } @@ -55,8 +63,9 @@ public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } int userid; - string displayname = ""; + string username = ""; string email = ""; + string displayname = ""; List profiles; Dictionary settings; string category = ""; @@ -71,8 +80,9 @@ User user = await UserService.GetUserAsync(userid, PageState.Site.SiteId); if (user != null) { - displayname = user.DisplayName; + username = user.Username; email = user.Email; + displayname = user.DisplayName; settings = await SettingService.GetUserSettingsAsync(user.UserId); } } diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index a7b35a38..9c232a7f 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -10,10 +10,18 @@
- + - +
+ + + +
- +
+ + + + @@ -26,10 +34,10 @@ @@ -63,9 +71,10 @@ public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } int userid; - string displayname = ""; - string email = ""; + string username = ""; string password = ""; + string email = ""; + string displayname = ""; List profiles; Dictionary settings; string category = ""; @@ -80,8 +89,9 @@ User user = await UserService.GetUserAsync(userid, PageState.Site.SiteId); if (user != null) { - displayname = user.DisplayName; + username = user.Username; email = user.Email; + displayname = user.DisplayName; settings = await SettingService.GetUserSettingsAsync(user.UserId); } } @@ -100,10 +110,12 @@ { try { - User user = new User(); - user.DisplayName = displayname; - user.Email = email; + User user = await UserService.GetUserAsync(userid, PageState.Site.SiteId); + user.SiteId = PageState.Site.SiteId; + user.Username = username; user.Password = password; + user.Email = email; + user.DisplayName = displayname; user = await UserService.UpdateUserAsync(user); await SettingService.UpdateUserSettingsAsync(settings, user.UserId); diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index a2a6b822..fbb3707c 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -15,11 +15,13 @@ else + + } diff --git a/Oqtane.Client/Modules/Admin/Users/Roles.razor b/Oqtane.Client/Modules/Admin/Users/Roles.razor new file mode 100644 index 00000000..69eb316c --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Users/Roles.razor @@ -0,0 +1,168 @@ +@namespace Oqtane.Modules.Admin.Users +@inherits ModuleBase +@inject IRoleService RoleService +@inject IUserRoleService UserRoleService + +@if (userroles == null) +{ +

Loading...

+} +else +{ +
- + - + +
+ + +
- + - +
Name      @context.User.DisplayName
+ + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + Cancel + +
+

+ +

+ Role +   +
+ + @context.Role.Name + + @if (!context.Role.IsSystem) + { + + } + + + +

+} + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } + + int userid; + List roles; + int roleid = -1; + string effectivedate = ""; + string expirydate = ""; + List userroles; + + protected override async Task OnInitializedAsync() + { + try + { + userid = Int32.Parse(PageState.QueryString["id"]); + roles = await RoleService.GetRolesAsync(PageState.Site.SiteId); + await GetUserRoles(); + } + catch (Exception ex) + { + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); + } + } + + private async Task GetUserRoles() + { + userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId); + userroles = userroles.Where(item => item.UserId == userid).ToList(); + } + + private async Task SaveUserRole() + { + try + { + if (roleid != -1) + { + UserRole userrole = userroles.Where(item => item.UserId == userid && item.RoleId == roleid).FirstOrDefault(); + if (userrole != null) + { + if (string.IsNullOrEmpty(effectivedate)) + { + userrole.EffectiveDate = null; + } + else + { + userrole.EffectiveDate = DateTime.Parse(effectivedate); + } + if (string.IsNullOrEmpty(expirydate)) + { + userrole.ExpiryDate = null; + } + else + { + userrole.ExpiryDate = DateTime.Parse(expirydate); + } + await UserRoleService.UpdateUserRoleAsync(userrole); + } + else + { + userrole = new UserRole(); + userrole.UserId = userid; + userrole.RoleId = roleid; + if (string.IsNullOrEmpty(effectivedate)) + { + userrole.EffectiveDate = null; + } + else + { + userrole.EffectiveDate = DateTime.Parse(effectivedate); + } + if (string.IsNullOrEmpty(expirydate)) + { + userrole.ExpiryDate = null; + } + else + { + userrole.ExpiryDate = DateTime.Parse(expirydate); + } + await UserRoleService.AddUserRoleAsync(userrole); + } + await GetUserRoles(); + ModuleInstance.AddModuleMessage("User Assigned To Role", MessageType.Success); + } + else + { + ModuleInstance.AddModuleMessage("You Must Select A Role", MessageType.Warning); + } + } + catch (Exception ex) + { + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); + } + } + + private async Task DeleteUserRole(int UserRoleId) + { + await UserRoleService.DeleteUserRoleAsync(UserRoleId); + await GetUserRoles(); + ModuleInstance.AddModuleMessage("User Removed From Role", MessageType.Success); + } + +} \ No newline at end of file diff --git a/Oqtane.Client/Modules/Controls/Pager.razor b/Oqtane.Client/Modules/Controls/Pager.razor index e1dc6b11..700e8195 100644 --- a/Oqtane.Client/Modules/Controls/Pager.razor +++ b/Oqtane.Client/Modules/Controls/Pager.razor @@ -67,7 +67,7 @@ IEnumerable ItemList { get; set; } - protected override void OnInitialized() + protected override void OnParametersSet() { if (string.IsNullOrEmpty(PageSize)) { diff --git a/Oqtane.Client/Services/UserService.cs b/Oqtane.Client/Services/UserService.cs index 23156458..4dce4763 100644 --- a/Oqtane.Client/Services/UserService.cs +++ b/Oqtane.Client/Services/UserService.cs @@ -45,7 +45,14 @@ namespace Oqtane.Services public async Task AddUserAsync(User User) { - return await http.PostJsonAsync(apiurl, User); + try + { + return await http.PostJsonAsync(apiurl, User); + } + catch + { + return null; + } } public async Task UpdateUserAsync(User User) diff --git a/Oqtane.Client/Shared/Installer.razor b/Oqtane.Client/Shared/Installer.razor index 479211f7..54191970 100644 --- a/Oqtane.Client/Shared/Installer.razor +++ b/Oqtane.Client/Shared/Installer.razor @@ -33,7 +33,7 @@ - + @@ -41,7 +41,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -83,10 +83,10 @@ - + - + @@ -94,7 +94,15 @@ - + + + + + + + + + @@ -116,8 +124,9 @@ private string DatabaseName = "Oqtane-" + DateTime.Now.ToString("yyyyMMddHHmm"); private string Username = ""; private string Password = ""; - private string Email = ""; + private string HostUsername = ""; private string HostPassword = ""; + private string HostEmail = ""; private string Message = ""; private string IntegratedSecurityDisplay = "display:none;"; @@ -172,10 +181,10 @@ User user = new User(); user.SiteId = site.SiteId; - user.Username = Email; - user.DisplayName = Email; - user.Email = Email; + user.Username = HostUsername; user.Password = HostPassword; + user.Email = HostEmail; + user.DisplayName = HostUsername; user = await UserService.AddUserAsync(user); NavigationManager.NavigateTo("", true); diff --git a/Oqtane.Server/Controllers/UserController.cs b/Oqtane.Server/Controllers/UserController.cs index 87b1be96..c767e479 100644 --- a/Oqtane.Server/Controllers/UserController.cs +++ b/Oqtane.Server/Controllers/UserController.cs @@ -82,7 +82,7 @@ namespace Oqtane.Controllers { identityuser = new IdentityUser(); identityuser.UserName = User.Username; - identityuser.Email = User.Username; + identityuser.Email = User.Email; var result = await IdentityUserManager.CreateAsync(identityuser, User.Password); if (result.Succeeded) { @@ -98,24 +98,19 @@ namespace Oqtane.Controllers userrole.ExpiryDate = null; UserRoles.AddUserRole(userrole); } - - // add auto assigned roles to user for site - List roles = Roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned == true).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); - } } } else { - user = Users.GetUser(User.Username); + var result = await IdentitySignInManager.CheckPasswordSignInAsync(identityuser, User.Password, false); + if (result.Succeeded) + { + user = Users.GetUser(User.Username); + } + } + if (user != null && hostroleid == -1) + { // add auto assigned roles to user for site List roles = Roles.GetRoles(User.SiteId).Where(item => item.IsAutoAssigned == true).ToList(); foreach (Role role in roles) diff --git a/Oqtane.Server/Pages/Login.cshtml.cs b/Oqtane.Server/Pages/Login.cshtml.cs index 4c08b1d5..d28b543e 100644 --- a/Oqtane.Server/Pages/Login.cshtml.cs +++ b/Oqtane.Server/Pages/Login.cshtml.cs @@ -37,6 +37,11 @@ namespace Oqtane.Pages await IdentitySignInManager.SignInAsync(identityuser, remember); } + if (!returnurl.StartsWith("/")) + { + returnurl = "/" + returnurl; + } + return LocalRedirect(Url.Content("~" + returnurl)); } } diff --git a/Oqtane.Server/Pages/Logout.cshtml.cs b/Oqtane.Server/Pages/Logout.cshtml.cs index e4629619..ee6f0df2 100644 --- a/Oqtane.Server/Pages/Logout.cshtml.cs +++ b/Oqtane.Server/Pages/Logout.cshtml.cs @@ -14,6 +14,11 @@ namespace Oqtane.Pages { await HttpContext.SignOutAsync(IdentityConstants.ApplicationScheme); + if (!returnurl.StartsWith("/")) + { + returnurl = "/" + returnurl; + } + return LocalRedirect(Url.Content("~" + returnurl)); } } diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index c52d6919..1430f594 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -44,6 +44,8 @@ namespace Oqtane.Repository ModuleDefinitionName = "Oqtane.Modules.Admin.Users, Oqtane.Client", ModulePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", Title = "User Management", Pane = "top", ContainerType = "Oqtane.Themes.Theme2.Container2, Oqtane.Client" }); SiteTemplate.Add(new PageTemplate { Name = "Role Management", Parent = "Admin", Path = "admin/roles", Order = 1, Icon = "lock-locked", IsNavigation = false, EditMode = true, PagePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", ModuleDefinitionName = "Oqtane.Modules.Admin.Roles, Oqtane.Client", ModulePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", Title = "Role Management", Pane = "top", ContainerType = "Oqtane.Themes.Theme2.Container2, Oqtane.Client" }); + SiteTemplate.Add(new PageTemplate { Name = "Tenant Management", Parent = "Admin", Path = "admin/tenants", Order = 1, Icon = "list", IsNavigation = false, EditMode = true, PagePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", + ModuleDefinitionName = "Oqtane.Modules.Admin.Tenants, Oqtane.Client", ModulePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", Title = "Site Management", Pane = "top", ContainerType = "Oqtane.Themes.Theme2.Container2, Oqtane.Client" }); SiteTemplate.Add(new PageTemplate { Name = "Login", Parent = "", Path = "login", Order = 1, Icon = "lock-locked", IsNavigation = false, EditMode = false, PagePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"All Users;Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", ModuleDefinitionName = "Oqtane.Modules.Admin.Login, Oqtane.Client", ModulePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"All Users;Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", Title = "Login", Pane = "top", ContainerType = "Oqtane.Themes.Theme2.Container2, Oqtane.Client" }); SiteTemplate.Add(new PageTemplate { Name = "Register", Parent = "", Path = "register", Order = 1, Icon = "person", IsNavigation = false, EditMode = false, PagePermissions = "[{\"PermissionName\":\"View\",\"Permissions\":\"All Users;Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]", @@ -86,8 +88,15 @@ namespace Oqtane.Repository private void CreateSite(Site site) { - RoleRepository.AddRole(new Role { SiteId = null, Name = Constants.AllUsersRole, Description = "All Users", IsAutoAssigned = false, IsSystem = true }); - RoleRepository.AddRole(new Role { SiteId = null, Name = Constants.HostRole, Description = "Application Administrators", IsAutoAssigned = false, IsSystem = true }); + List roles = RoleRepository.GetRoles(site.SiteId, true).ToList(); + if (!roles.Where(item => item.Name == Constants.AllUsersRole).Any()) + { + RoleRepository.AddRole(new Role { SiteId = null, Name = Constants.AllUsersRole, Description = "All Users", IsAutoAssigned = false, IsSystem = true }); + } + if (!roles.Where(item => item.Name == Constants.HostRole).Any()) + { + RoleRepository.AddRole(new Role { SiteId = null, Name = Constants.HostRole, Description = "Application Administrators", IsAutoAssigned = false, IsSystem = true }); + } RoleRepository.AddRole(new Role { SiteId = site.SiteId, Name = Constants.RegisteredRole, Description = "Registered Users", IsAutoAssigned = true, IsSystem = true }); RoleRepository.AddRole(new Role { SiteId = site.SiteId, Name = Constants.AdminRole, Description = "Site Administrators", IsAutoAssigned = false, IsSystem = true });