diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index 5310049d..41f36dc3 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -81,8 +81,7 @@ private async Task Login() { - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); - if (authstateprovider == null) + if (PageState.Runtime == Runtime.Server) { // server-side Blazor User user = new User(); @@ -116,6 +115,7 @@ if (user.IsAuthenticated) { await logger.LogInformation("Login Successful For Username {Username}", _username); + var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); authstateprovider.NotifyAuthenticationChanged(); NavigationManager.NavigateTo(NavigateUrl(_returnUrl, "reload")); } diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index d66027f3..a95adf1b 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -10,7 +10,7 @@ 7.3 3.0 - Debug;Release;Wasm + Debug;Release;WebAssembly 0.0.9 Oqtane Shaun Walker @@ -24,7 +24,7 @@ Oqtane - + TRACE;WASM diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index ca04c0c4..b256ca9b 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -1,4 +1,7 @@ -namespace Oqtane +// DO NOT REMOVE - needed for client-side Blazor +using Microsoft.AspNetCore.Blazor.Hosting; + +namespace Oqtane.Client { public class Program { diff --git a/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs b/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs index 04450500..e0bc3a24 100644 --- a/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs +++ b/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs @@ -1,4 +1,5 @@ using Oqtane.Models; +using Oqtane.UI; using System.Collections.Generic; using System.Threading.Tasks; @@ -11,6 +12,6 @@ namespace Oqtane.Services Task UpdateModuleDefinitionAsync(ModuleDefinition moduleDefinition); Task InstallModuleDefinitionsAsync(); Task DeleteModuleDefinitionAsync(int moduleDefinitionId, int siteId); - Task LoadModuleDefinitionsAsync(int siteId); + Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime); } } diff --git a/Oqtane.Client/Services/ModuleDefinitionService.cs b/Oqtane.Client/Services/ModuleDefinitionService.cs index ea1e658f..0d3cc4aa 100644 --- a/Oqtane.Client/Services/ModuleDefinitionService.cs +++ b/Oqtane.Client/Services/ModuleDefinitionService.cs @@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Components; using System; using System.Reflection; using Oqtane.Shared; -using Oqtane.Providers; +using Oqtane.UI; namespace Oqtane.Services { @@ -16,14 +16,12 @@ namespace Oqtane.Services private readonly HttpClient _http; private readonly SiteState _siteState; private readonly NavigationManager _navigationManager; - private readonly IServiceProvider _serviceProvider; - public ModuleDefinitionService(HttpClient http, SiteState siteState, NavigationManager navigationManager, IServiceProvider serviceProvider) + public ModuleDefinitionService(HttpClient http, SiteState siteState, NavigationManager navigationManager) { _http = http; _siteState = siteState; _navigationManager = navigationManager; - _serviceProvider = serviceProvider; } private string Apiurl @@ -57,14 +55,13 @@ namespace Oqtane.Services await _http.DeleteAsync(Apiurl + "/" + moduleDefinitionId.ToString() + "?siteid=" + siteId.ToString()); } - public async Task LoadModuleDefinitionsAsync(int siteId) + public async Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime) { // get list of modules from the server List moduledefinitions = await GetModuleDefinitionsAsync(siteId); // download assemblies to browser when running client-side Blazor - var authstateprovider = (IdentityAuthenticationStateProvider)_serviceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); - if (authstateprovider != null) + if (runtime == Runtime.WebAssembly) { // get list of loaded assemblies on the client ( in the client-side hosting module the browser client has its own app domain ) Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); diff --git a/Oqtane.Client/Themes/Controls/Login.razor b/Oqtane.Client/Themes/Controls/Login.razor index f8dbddd3..5778af99 100644 --- a/Oqtane.Client/Themes/Controls/Login.razor +++ b/Oqtane.Client/Themes/Controls/Login.razor @@ -33,8 +33,7 @@ { await UserService.LogoutUserAsync(PageState.User); - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); - if (authstateprovider == null) + if (PageState.Runtime == Runtime.Server) { // server-side Blazor var interop = new Interop(jsRuntime); @@ -45,6 +44,7 @@ else { // client-side Blazor + var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); authstateprovider.NotifyAuthenticationChanged(); NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "reload")); } diff --git a/Oqtane.Client/UI/PageState.cs b/Oqtane.Client/UI/PageState.cs index e801ad73..a2678802 100644 --- a/Oqtane.Client/UI/PageState.cs +++ b/Oqtane.Client/UI/PageState.cs @@ -18,5 +18,6 @@ namespace Oqtane.UI public string Action { get; set; } public bool EditMode { get; set; } public DateTime LastSyncDate { get; set; } + public Runtime Runtime { get; set; } } } diff --git a/Oqtane.Client/UI/Runtime.cs b/Oqtane.Client/UI/Runtime.cs new file mode 100644 index 00000000..dcc886b1 --- /dev/null +++ b/Oqtane.Client/UI/Runtime.cs @@ -0,0 +1,8 @@ +namespace Oqtane.UI +{ + public enum Runtime + { + Server, + WebAssembly + } +} diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 6bc85872..205c4ef4 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -13,6 +13,7 @@ @inject ILogService LogService @using System.Diagnostics.CodeAnalysis @using Oqtane.Enums +@using System.Runtime.InteropServices @implements IHandleAfterRender @DynamicComponent @@ -81,6 +82,7 @@ bool editmode = false; Reload reload = Reload.None; DateTime lastsyncdate = DateTime.UtcNow; + Runtime runtime = GetRuntime(); // get Url path and querystring ( and remove anchors ) string path = new Uri(_absoluteUri).PathAndQuery.Substring(1); @@ -162,7 +164,7 @@ if (PageState == null || reload >= Reload.Site) { - await ModuleDefinitionService.LoadModuleDefinitionsAsync(site.SiteId); + await ModuleDefinitionService.LoadModuleDefinitionsAsync(site.SiteId, runtime); pages = await PageService.GetPagesAsync(site.SiteId); } else @@ -248,7 +250,8 @@ Uri = new Uri(_absoluteUri, UriKind.Absolute), QueryString = querystring, ModuleId = moduleid, - Action = action + Action = action, + Runtime = runtime }; if (PageState != null && (PageState.ModuleId != _pagestate.ModuleId || PageState.Action != _pagestate.Action)) @@ -458,4 +461,15 @@ return modules; } + private Runtime GetRuntime() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Create("WEBASSEMBLY"))) + { + return Runtime.WebAssembly; + } + else + { + return Runtime.Server; + } + } } diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index 0e0e0d95..32847187 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -8,7 +8,7 @@ https://dotnet.myget.org/F/blazor-dev/api/v3/index.json; true - Debug;Release;Wasm + Debug;Release;WebAssembly 0.0.9 Oqtane Shaun Walker @@ -22,7 +22,7 @@ Oqtane - + TRACE;WASM diff --git a/Oqtane.Server/Program.cs b/Oqtane.Server/Program.cs index 89bb47b3..b440e758 100644 --- a/Oqtane.Server/Program.cs +++ b/Oqtane.Server/Program.cs @@ -1,9 +1,11 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; +// DO NOT REMOVE - needed for client-side Blazor +using Microsoft.AspNetCore.Blazor.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore; -// used by client-side Blazor - -namespace Oqtane +namespace Oqtane.Server { public class Program { diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index d1d0d1d5..096871c7 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -243,12 +243,14 @@ namespace Oqtane.Repository _pageTemplates.Add(new PageTemplate { Name = "Login", Parent = "", Path = "login", Icon = "lock-locked", IsNavigation = false, IsPersonalizable = false, EditMode = false, PagePermissions = _permissionRepository.EncodePermissions(new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.AllUsersRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), PageTemplateModules = new List { new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.Admin.Login, Oqtane.Client", Title = "User Login", Pane = "Content", ModulePermissions = _permissionRepository.EncodePermissions( new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.AllUsersRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), Content = "" } } @@ -256,12 +258,14 @@ namespace Oqtane.Repository _pageTemplates.Add(new PageTemplate { Name = "Register", Parent = "", Path = "register", Icon = "person", IsNavigation = false, IsPersonalizable = false, EditMode = false, PagePermissions = _permissionRepository.EncodePermissions(new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.AllUsersRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), PageTemplateModules = new List { new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.Admin.Register, Oqtane.Client", Title = "User Registration", Pane = "Content", ModulePermissions = _permissionRepository.EncodePermissions( new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.AllUsersRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), Content = "" } } @@ -270,12 +274,14 @@ namespace Oqtane.Repository _pageTemplates.Add(new PageTemplate { Name = "Reset", Parent = "", Path = "reset", Icon = "person", IsNavigation = false, IsPersonalizable = false, EditMode = false, PagePermissions = _permissionRepository.EncodePermissions(new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.AllUsersRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), PageTemplateModules = new List { new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.Admin.Reset, Oqtane.Client", Title = "Password Reset", Pane = "Content", ModulePermissions = _permissionRepository.EncodePermissions( new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.AllUsersRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), Content = "" } } @@ -283,12 +289,14 @@ namespace Oqtane.Repository _pageTemplates.Add(new PageTemplate { Name = "Profile", Parent = "", Path = "profile", Icon = "person", IsNavigation = false, IsPersonalizable = false, EditMode = false, PagePermissions = _permissionRepository.EncodePermissions(new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.RegisteredRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), PageTemplateModules = new List { new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.Admin.UserProfile, Oqtane.Client", Title = "User Profile", Pane = "Content", ModulePermissions = _permissionRepository.EncodePermissions( new List { new Permission(PermissionNames.View, Constants.AdminRole, true), + new Permission(PermissionNames.View, Constants.RegisteredRole, true), new Permission(PermissionNames.Edit, Constants.AdminRole, true) }), Content = "" } } diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index 92e3476f..b961fd06 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -19,7 +19,9 @@ using Oqtane.Infrastructure.Interfaces; using Oqtane.Repository; using Oqtane.Security; using Oqtane.Services; -using Oqtane.Shared; // needed for WASM +// DO NOT REMOVE - needed for client-side Blazor +using Oqtane.Shared; +using Microsoft.AspNetCore.ResponseCompression; namespace Oqtane { diff --git a/Oqtane.Shared/Oqtane.Shared.csproj b/Oqtane.Shared/Oqtane.Shared.csproj index d252b2aa..830bda51 100644 --- a/Oqtane.Shared/Oqtane.Shared.csproj +++ b/Oqtane.Shared/Oqtane.Shared.csproj @@ -3,7 +3,7 @@ netstandard2.1 7.3 - Debug;Release;Wasm + Debug;Release;WebAssembly 0.0.9 Oqtane Shaun Walker @@ -17,7 +17,7 @@ Oqtane - + TRACE;WASM diff --git a/Oqtane.sln b/Oqtane.sln index 4c51a92b..3832d333 100644 --- a/Oqtane.sln +++ b/Oqtane.sln @@ -11,45 +11,45 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Shared", "Oqtane.Sha EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Upgrade", "Oqtane.Upgrade\Oqtane.Upgrade.csproj", "{2E8C6889-37CF-4C8D-88B1-505547F25098}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oqtane.Test", "Oqtane.Test\Oqtane.Test.csproj", "{823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Test", "Oqtane.Test\Oqtane.Test.csproj", "{823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU - Wasm|Any CPU = Wasm|Any CPU + WebAssembly|Any CPU = WebAssembly|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {083BB22D-DF24-43A2-95E5-8F385CCB3318}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {083BB22D-DF24-43A2-95E5-8F385CCB3318}.Debug|Any CPU.Build.0 = Debug|Any CPU {083BB22D-DF24-43A2-95E5-8F385CCB3318}.Release|Any CPU.ActiveCfg = Release|Any CPU {083BB22D-DF24-43A2-95E5-8F385CCB3318}.Release|Any CPU.Build.0 = Release|Any CPU - {083BB22D-DF24-43A2-95E5-8F385CCB3318}.Wasm|Any CPU.ActiveCfg = Wasm|Any CPU - {083BB22D-DF24-43A2-95E5-8F385CCB3318}.Wasm|Any CPU.Build.0 = Wasm|Any CPU + {083BB22D-DF24-43A2-95E5-8F385CCB3318}.WebAssembly|Any CPU.ActiveCfg = WebAssembly|Any CPU + {083BB22D-DF24-43A2-95E5-8F385CCB3318}.WebAssembly|Any CPU.Build.0 = WebAssembly|Any CPU {FD15B24A-7F6A-4830-9CA2-9C621771C330}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD15B24A-7F6A-4830-9CA2-9C621771C330}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD15B24A-7F6A-4830-9CA2-9C621771C330}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD15B24A-7F6A-4830-9CA2-9C621771C330}.Release|Any CPU.Build.0 = Release|Any CPU - {FD15B24A-7F6A-4830-9CA2-9C621771C330}.Wasm|Any CPU.ActiveCfg = Wasm|Any CPU - {FD15B24A-7F6A-4830-9CA2-9C621771C330}.Wasm|Any CPU.Build.0 = Wasm|Any CPU + {FD15B24A-7F6A-4830-9CA2-9C621771C330}.WebAssembly|Any CPU.ActiveCfg = WebAssembly|Any CPU + {FD15B24A-7F6A-4830-9CA2-9C621771C330}.WebAssembly|Any CPU.Build.0 = WebAssembly|Any CPU {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.Release|Any CPU.Build.0 = Release|Any CPU - {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.Wasm|Any CPU.ActiveCfg = Wasm|Any CPU - {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.Wasm|Any CPU.Build.0 = Wasm|Any CPU + {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.WebAssembly|Any CPU.ActiveCfg = WebAssembly|Any CPU + {19D67A9D-3F2E-41BD-80E6-0B50CA83C3AE}.WebAssembly|Any CPU.Build.0 = WebAssembly|Any CPU {2E8C6889-37CF-4C8D-88B1-505547F25098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E8C6889-37CF-4C8D-88B1-505547F25098}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E8C6889-37CF-4C8D-88B1-505547F25098}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E8C6889-37CF-4C8D-88B1-505547F25098}.Release|Any CPU.Build.0 = Release|Any CPU - {2E8C6889-37CF-4C8D-88B1-505547F25098}.Wasm|Any CPU.ActiveCfg = Debug|Any CPU - {2E8C6889-37CF-4C8D-88B1-505547F25098}.Wasm|Any CPU.Build.0 = Debug|Any CPU + {2E8C6889-37CF-4C8D-88B1-505547F25098}.WebAssembly|Any CPU.ActiveCfg = Debug|Any CPU + {2E8C6889-37CF-4C8D-88B1-505547F25098}.WebAssembly|Any CPU.Build.0 = Debug|Any CPU {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.Debug|Any CPU.Build.0 = Debug|Any CPU {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.Release|Any CPU.ActiveCfg = Release|Any CPU {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.Release|Any CPU.Build.0 = Release|Any CPU - {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.Wasm|Any CPU.ActiveCfg = Debug|Any CPU - {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.Wasm|Any CPU.Build.0 = Debug|Any CPU + {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.WebAssembly|Any CPU.ActiveCfg = Debug|Any CPU + {823B556D-8D4E-4BB8-A65A-C4EB5E7E7424}.WebAssembly|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE