diff --git a/src/blazor/admin/BootstrapAdmin.Web/Controllers/AccountController.cs b/src/blazor/admin/BootstrapAdmin.Web/Controllers/AccountController.cs index 9b0dc5ba..c9a02678 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Controllers/AccountController.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Controllers/AccountController.cs @@ -30,7 +30,7 @@ namespace Bootstrap.Admin.Controllers /// /// [HttpPost] - public async Task Login(string userName, string password, [FromQuery] string? remember, + public async Task Login(string userName, string password, [FromQuery] string? remember, [FromQuery] string? returnUrl, [FromServices] IUser userService, [FromServices] IDict dictService, [FromServices] ILogin loginService) @@ -50,28 +50,28 @@ namespace Bootstrap.Admin.Controllers } await loginService.Log(userName, auth); - return auth ? await SignInAsync(userName, persistent, period) : RedirectLogin(); + return auth ? await SignInAsync(userName, persistent, period, returnUrl) : RedirectLogin(returnUrl); } - private async Task SignInAsync(string userName, bool persistent, int period = 0, string authenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme) + private async Task SignInAsync(string userName, bool persistent, int period = 0, string? returnUrl = null, string authenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme) { var identity = new ClaimsIdentity(authenticationScheme); identity.AddClaim(new Claim(ClaimTypes.Name, userName)); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), new AuthenticationProperties { ExpiresUtc = DateTimeOffset.Now.AddDays(period), IsPersistent = persistent }); - // redirect origin url - var originUrl = Request.Query[CookieAuthenticationDefaults.ReturnUrlParameter].FirstOrDefault() ?? "/Home/Index"; - return Redirect(originUrl); + return Redirect(returnUrl ?? "/Home/Index"); } - private IActionResult RedirectLogin() + private IActionResult RedirectLogin(string? returnUrl = null) { var query = Request.Query.Aggregate(new Dictionary(), (d, v) => { d.Add(v.Key, v.Value.ToString()); return d; }); - return Redirect(QueryHelpers.AddQueryString(Request.PathBase + CookieAuthenticationDefaults.LoginPath, query)); + return returnUrl == null + ? Redirect(QueryHelpers.AddQueryString(Request.PathBase + CookieAuthenticationDefaults.LoginPath, query)) + : Redirect(returnUrl); } #endregion @@ -94,14 +94,9 @@ namespace Bootstrap.Admin.Controllers /// /// 短信验证登陆方法 /// - /// - /// - /// - /// - /// Remember. /// [HttpPost()] - public async Task Mobile(string phone, string code, [FromQuery] string? remember, + public async Task Mobile(string phone, string code, [FromQuery] string? remember, [FromQuery] string? returnUrl, [FromServices] ISMSProvider provider, [FromServices] ILogin loginService, [FromServices] IUser userService, @@ -123,7 +118,7 @@ namespace Bootstrap.Admin.Controllers { userService.TryCreateUserByPhone(phone, code, context.AppId, provider.Options.Roles); } - return auth ? await SignInAsync(phone, persistent, period, MobileSchema) : RedirectLogin(); + return auth ? await SignInAsync(phone, persistent, period, returnUrl, MobileSchema) : RedirectLogin(returnUrl); } #endregion diff --git a/src/blazor/admin/BootstrapAdmin.Web/Pages/Account/Login.razor.cs b/src/blazor/admin/BootstrapAdmin.Web/Pages/Account/Login.razor.cs index 6cd8f825..92d690a8 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Pages/Account/Login.razor.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Pages/Account/Login.razor.cs @@ -17,7 +17,11 @@ public partial class Login private bool RememberPassword { get; set; } - private string? PostUrl { get; set; } = "/Account/Login"; + private string? PostUrl { get; set; } + + [SupplyParameterFromQuery] + [Parameter] + public string? ReturnUrl { get; set; } [Inject] [NotNull] @@ -31,18 +35,23 @@ public partial class Login base.OnInitialized(); Title = DictsService.GetWebTitle(); + + PostUrl = QueryHelper.AddQueryString("/Account/Login", "ReturnUrl", ReturnUrl ?? ""); } void OnClickSwitchButton() { var rem = RememberPassword ? "true" : "false"; - PostUrl = UseMobileLogin ? $"/Account/Mobile?remember={rem}" : $"/Account/Login?remember={rem}"; + PostUrl = QueryHelper.AddQueryString(UseMobileLogin ? "/Account/Mobile" : "/Account/Login", new Dictionary() + { + [nameof(ReturnUrl)] = ReturnUrl, + ["remember"] = rem + }); } Task OnRememberPassword(bool remember) { - var rem = remember ? "true" : "false"; - PostUrl = UseMobileLogin ? $"/Account/Mobile?remember={rem}" : $"/Account/Login?remember={rem}"; + OnClickSwitchButton(); return Task.CompletedTask; } diff --git a/src/blazor/client/BootstrapClient.Shared/Shared/MainLayout.razor.cs b/src/blazor/client/BootstrapClient.Shared/Shared/MainLayout.razor.cs index 148577d1..7c4a4cdd 100644 --- a/src/blazor/client/BootstrapClient.Shared/Shared/MainLayout.razor.cs +++ b/src/blazor/client/BootstrapClient.Shared/Shared/MainLayout.razor.cs @@ -73,6 +73,10 @@ namespace BootstrapClient.Web.Shared.Shared [NotNull] private IOptions? AuthorizationOption { get; set; } + [Inject] + [NotNull] + private NavigationManager? NavigationManager { get; set; } + /// /// OnInitialized 方法 /// @@ -95,6 +99,6 @@ namespace BootstrapClient.Web.Shared.Shared private Task OnAuthorizing(string url) => SecurityService.AuhorizingNavigation(UserName, url); - private string GetAuthorUrl() => $"{AuthorizationOption.Value.AuthHost}/Account/Login"; + private string GetAuthorUrl() => $"{AuthorizationOption.Value.AuthHost}/Account/Login?ReturnUrl={NavigationManager.Uri}"; } }