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

.NET 8 Blazor Server自定义未授权跳转失效问题求助

问题分析与解决

你的问题核心是ASP.NET Core Identity的默认认证中间件优先级高于Blazor组件级的<NotAuthorized>逻辑。即使你在<AuthorizeRouteView>里配置了跳转逻辑,Identity的Cookie认证中间件会先检测到未授权请求,直接重定向到它默认的/Account/Login路径,覆盖了Blazor的组件跳转逻辑。

解决步骤

1. 修改Identity认证中间件的默认登录路径

在Program.cs中,找到Identity相关的配置代码,添加或修改Cookie认证选项,把默认登录路径改为你的自定义/ui/Login:

如果你的项目使用AddIdentityCookies(.NET8 Blazor Web App默认模板写法):

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = IdentityConstants.ApplicationScheme;
    options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies(options =>
{
    // 配置应用Cookie的登录路径
    options.ApplicationCookie.Configure(opt =>
    {
        opt.LoginPath = "/ui/Login";
        // 可选:若需要,同时配置权限不足时的跳转路径
        // opt.AccessDeniedPath = "/ui/AccessDenied";
    });
});

如果你的项目使用AddDefaultIdentity:

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddSignInManager();

// 单独配置应用Cookie的登录路径
builder.Services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/ui/Login";
});

2. 修正RedirectToLogin组件的路径问题

你当前使用的是相对路径ui/Login,当用户在子路径下访问授权页面时,会生成错误的跳转地址(比如当前路径是/dashboard,会跳转到/dashboard/ui/Login)。需要改为绝对路径:

@inject NavigationManager NavigationManager
@attribute [AllowAnonymous]

@code {
    protected override void OnInitialized()
    {
        NavigationManager.NavigateTo($"/ui/Login?returnUrl={Uri.EscapeDataString(NavigationManager.Uri)}", forceLoad: true);
    }
}

3. 明确<NotAuthorized>的作用

<NotAuthorized>的核心作用是处理用户已登录但权限不足的场景,而非未登录的情况——未登录的重定向由Identity中间件直接处理。修改完中间件配置后,两种场景都会正确跳转到你的自定义登录页:

  • 用户未登录访问授权页面:Identity中间件直接重定向到/ui/Login
  • 用户已登录但权限不足:<NotAuthorized>触发,通过RedirectToLogin组件跳转(你也可以在这里改为权限不足的提示页面)

内容的提问来源于stack exchange,提问作者SSteve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:21:14