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

Blazor中未授权用户的多页面路由配置方案咨询

最优解决方案:路由级别的授权过滤

方案思路

在App.razor的路由匹配逻辑中,直接区分允许匿名访问的路由和需要授权的路由:

  • 对于/Login、/SignUp这类白名单路由,跳过授权检查直接渲染页面
  • 其他路由则通过AuthorizeRouteView做授权校验,未授权时自动跳转到登录页,同时保留路由的URI功能

步骤1:修改App.razor文件

替换原有授权逻辑,增加路由白名单判断:

@using MyFirstServerSideBlazor.Pages
@inject NavigationManager Navigation

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(App).Assembly">
        <Found Context="routeData">
            @{
                // 定义允许匿名访问的路由列表(注意路由大小写统一)
                var allowedAnonymousRoutes = new List<string> { "/login", "/signup" };
                var currentRelativePath = $"/{Navigation.ToBaseRelativePath(Navigation.Uri).ToLower()}";
                var isAnonymousRoute = allowedAnonymousRoutes.Contains(currentRelativePath);
            }

            @if (isAnonymousRoute)
            {
                // 匿名路由直接渲染,使用LoginBody布局
                <RouteView RouteData="@routeData" DefaultLayout="@typeof(LoginBody)" />
            }
            else
            {
                // 需要授权的路由走校验逻辑
                <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainHeaderLayout)">
                    <NotAuthorized>
                        <RedirectToLogin />
                    </NotAuthorized>
                </AuthorizeRouteView>
            }
        </Found>
        <NotFound>
            <PageTitle>Not found</PageTitle>
            <p role="alert">Sorry, there's nothing at this address.</p>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

步骤2:创建RedirectToLogin组件

这个组件负责将未授权用户重定向到登录页,并携带原访问地址(方便登录后返回):

@inject NavigationManager Navigation

@code {
    protected override void OnInitialized()
    {
        // 编码原地址作为返回参数
        var returnUrl = Uri.EscapeDataString(Navigation.Uri);
        Navigation.NavigateTo($"/login?returnUrl={returnUrl}");
    }
}

可选优化:给匿名页面加特性标记

虽然通过白名单已经实现了匿名访问,但给Login和SignUp页面加上[AllowAnonymous]特性可以形成双重校验,避免其他授权逻辑影响:

using Microsoft.AspNetCore.Authorization;

[AllowAnonymous]
public partial class Login
{
    // 页面逻辑
}

方案优势

  • 保留了路由的URI功能,用户可以直接通过地址栏访问/Login或/SignUp
  • 无需在每个需要授权的页面加特性,只需维护一个路由白名单
  • 逻辑清晰,未授权用户访问受限路由时自动跳转,符合常规路由体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:54:17