diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index d237190b..22fa249f 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -1,3 +1,4 @@ +@using System.Net @namespace Oqtane.Modules.Admin.Login @inherits ModuleBase @inject NavigationManager NavigationManager @@ -205,7 +206,7 @@ var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider .GetService(typeof(IdentityAuthenticationStateProvider)); authstateprovider.NotifyAuthenticationChanged(); - NavigationManager.NavigateTo(NavigateUrl(_returnUrl, true)); + NavigationManager.NavigateTo(NavigateUrl(WebUtility.UrlDecode(_returnUrl), true)); } else { diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor index d763a5de..ed0c586c 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor @@ -106,12 +106,6 @@ else { try { - // external link to log item will display Details component - if (PageState.QueryString.ContainsKey("id") && int.TryParse(PageState.QueryString["id"], out int id)) - { - NavigationManager.NavigateTo(EditUrl(PageState.Page.Path, ModuleState.ModuleId, "Detail", $"/{id}")); - } - if (UrlParameters.ContainsKey("level")) { _level = UrlParameters["level"]; @@ -241,4 +235,15 @@ else _page = page; } + protected override void OnAfterRender(bool firstRender) + { + if (!firstRender) + { + // external link to log item will display Details component + if (PageState.QueryString.ContainsKey("id") && int.TryParse(PageState.QueryString["id"], out int id)) + { + NavigationManager.NavigateTo(EditUrl(PageState.Page.Path, ModuleState.ModuleId, "Detail", $"/{id}")); + } + } + } } diff --git a/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs b/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs index 2e66f96c..9c0f2192 100644 --- a/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs +++ b/Oqtane.Client/Themes/Controls/Theme/LoginBase.cs @@ -1,8 +1,10 @@ using System; +using System.Net; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using Oqtane.Enums; +using Oqtane.Models; using Oqtane.Providers; using Oqtane.Security; using Oqtane.Services; @@ -22,20 +24,18 @@ namespace Oqtane.Themes.Controls protected void LoginUser() { - var returnurl = PageState.Alias.Path; - if (PageState.Page.Path != "/") - { - returnurl += "/" + PageState.Page.Path; - } - NavigationManager.NavigateTo(NavigateUrl("login", "?returnurl=" + returnurl)); + Route route = new Route(PageState.Uri.AbsoluteUri, PageState.Alias.Path); + NavigationManager.NavigateTo(NavigateUrl("login", "?returnurl=" + WebUtility.UrlEncode(route.PathAndQuery))); } protected async Task LogoutUser() { await LoggingService.Log(PageState.Alias, PageState.Page.PageId, null, PageState.User?.UserId, GetType().AssemblyQualifiedName, "Logout", LogFunction.Security, LogLevel.Information, null, "User Logout For Username {Username}", PageState.User?.Username); - // check if anonymous user can access page - var url = PageState.Alias.Path + "/" + PageState.Page.Path; + Route route = new Route(PageState.Uri.AbsoluteUri, PageState.Alias.Path); + var url = route.PathAndQuery; + + // verify if anonymous users can access page if (!UserSecurity.IsAuthorized(null, PermissionNames.View, PageState.Page.Permissions)) { url = PageState.Alias.Path; diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index f003bd49..9c7dedb9 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -250,7 +250,7 @@ if (user == null) { // redirect to login page if user not logged in as they may need to be authenticated - NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, "login", "?returnurl=" + route.AbsolutePath)); + NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, "login", "?returnurl=" + WebUtility.UrlEncode(route.PathAndQuery))); } else { diff --git a/Oqtane.Server/Pages/Login.cshtml.cs b/Oqtane.Server/Pages/Login.cshtml.cs index 40202a16..7fa4bb87 100644 --- a/Oqtane.Server/Pages/Login.cshtml.cs +++ b/Oqtane.Server/Pages/Login.cshtml.cs @@ -1,3 +1,4 @@ +using System.Net; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; @@ -43,6 +44,10 @@ namespace Oqtane.Pages { returnurl = ""; } + else + { + returnurl = WebUtility.UrlDecode(returnurl); + } if (!returnurl.StartsWith("/")) { returnurl = "/" + returnurl; diff --git a/Oqtane.Shared/Models/Route.cs b/Oqtane.Shared/Models/Route.cs index 9b4cc683..43385d8f 100644 --- a/Oqtane.Shared/Models/Route.cs +++ b/Oqtane.Shared/Models/Route.cs @@ -24,6 +24,7 @@ namespace Oqtane.Models Query = uri.Query; Fragment = uri.Fragment; AbsolutePath = uri.AbsolutePath; + PathAndQuery = uri.PathAndQuery; AliasPath = aliaspath; PagePath = AbsolutePath; ModuleId = ""; @@ -90,6 +91,11 @@ namespace Oqtane.Models /// public string AbsolutePath { get; set; } + /// + /// The absolute path for the route including the querystring + /// + public string PathAndQuery { get; set; } + /// /// An absolute path may contain an alias path ///