服务端Blazor应用登录后如何重定向回用户登录前访问的页面
Blazor Server端登录后重定向回原页面的实现方案
核心实现逻辑
整个流程分为3个核心步骤:
- 触发登录跳转时,将当前页面的完整URI编码后作为
returnUrl查询参数传递给登录页 - 登录页接收并暂存
returnUrl参数 - 登录验证通过后,校验
returnUrl为站内合法地址后执行重定向,非法则回退到首页
详细实现代码
1. 登录跳转逻辑(放置登录按钮的组件)
注入NavigationManager获取当前页面地址,跳转登录时携带参数:
@inject NavigationManager NavMgr <!-- 登录按钮 --> <button @onclick="GoToLogin">登录</button> @code { private void GoToLogin() { // 对当前地址做编码处理,避免特殊字符导致参数异常 var encodedReturnUrl = Uri.EscapeDataString(NavMgr.Uri); NavMgr.NavigateTo($"/Account/Login?returnUrl={encodedReturnUrl}"); } }
2. 登录页参数接收与重定向逻辑
用[SupplyParameterFromQuery]接收查询参数,登录成功后先校验地址合法性再跳转:
@page "/Account/Login" @inject NavigationManager NavMgr @inject SignInManager<IdentityUser> SignInManager <!-- 省略登录表单UI代码 --> @code { // 接收查询参数中的returnUrl [SupplyParameterFromQuery(Name = "returnUrl")] public string? ReturnUrl { get; set; } // 登录表单提交后的处理方法 private async Task HandleLoginSubmit(LoginInputModel Input) { // 省略账号密码校验、登录逻辑代码 var signInResult = await SignInManager.PasswordSignInAsync( Input.UserName, Input.Password, Input.RememberMe, lockoutOnFailure: false ); if (signInResult.Succeeded) { // *必须对returnUrl做合法性校验,禁止直接跳转外部地址,避免开放重定向安全漏洞* if (!string.IsNullOrEmpty(ReturnUrl) && NavMgr.IsBaseUri(ReturnUrl)) { // forceLoad设为true可强制刷新页面,确保新的认证Cookie生效 NavMgr.NavigateTo(ReturnUrl, forceLoad: true); } else { // 地址不合法时默认跳转到首页 NavMgr.NavigateTo("/", forceLoad: true); } } } }
额外适配场景
如果是[Authorize]属性触发的自动重定向到登录页,ASP.NET Core Identity默认已经自动携带当前请求地址作为returnUrl参数,不需要额外修改跳转逻辑,只需保证登录页的重定向逻辑按上述实现即可。
内容的提问来源于stack exchange,提问作者Jonathan Allen
相关产品推荐
相关产品推荐

