Blazor Server跳转登录页面时抛出异常的问题解决求助
问题修复方案
核心问题
你的代码出现异常的根本原因是无限循环跳转:当未认证用户访问登录页(/login)时,AuthorizeView的NotAuthorized分支会再次加载LoginRedirect组件,导致重复跳转到/login,触发Blazor导航循环异常。
具体修复步骤
- 给登录页添加匿名访问权限
在你的Login组件(Pages/Login.razor)顶部添加以下属性,允许未认证用户直接访问登录页:
@attribute [AllowAnonymous]
- 修改LoginRedirect组件,避免循环跳转并优化参数处理
更新LoginRedirect的OnInitializedAsync方法,增加当前路径判断,并对返回URL进行URI编码:
using Microsoft.AspNetCore.Components; namespace BlazorJwtToken.Shared { public partial class LoginRedirect { [Inject] NavigationManager? NavigationManager { get; set; } protected override Task OnInitializedAsync() { if (NavigationManager == null) return Task.CompletedTask; var currentRelativePath = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); // 若当前已在登录页,终止跳转逻辑 if (string.Equals(currentRelativePath, "login", StringComparison.OrdinalIgnoreCase)) { return Task.CompletedTask; } // 对返回URL进行URI编码,避免特殊字符导致参数失效 var encodedReturnUrl = Uri.EscapeDataString("/" + currentRelativePath); NavigationManager.NavigateTo($"/login?returnUrl={encodedReturnUrl}", forceLoad: false); return Task.CompletedTask; } } }
额外优化建议
可以简化App.razor中NotFound部分的授权判断逻辑,统一使用LoginRedirect的处理逻辑即可,无需重复写AuthorizeView:
<NotFound> <PageTitle>Not found</PageTitle> <AuthorizeView> <Authorized> <LayoutView Layout="@typeof(MainLayout)"> <p role="alert">Sorry, there's nothing at this address.</p> </LayoutView> </Authorized> <NotAuthorized> <LoginRedirect></LoginRedirect> </NotAuthorized> </AuthorizeView> </NotFound>
内容的提问来源于stack exchange,提问作者mnu-nasir
相关产品推荐
相关产品推荐

