You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server跳转登录页面时抛出异常的问题解决求助

问题修复方案

核心问题

你的代码出现异常的根本原因是无限循环跳转:当未认证用户访问登录页(/login)时,AuthorizeView的NotAuthorized分支会再次加载LoginRedirect组件,导致重复跳转到/login,触发Blazor导航循环异常。

具体修复步骤

  1. 给登录页添加匿名访问权限
    在你的Login组件(Pages/Login.razor)顶部添加以下属性,允许未认证用户直接访问登录页:
@attribute [AllowAnonymous]
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:48:28