Blazor文件夹授权不生效 未登录用户可访问受限内容求助
问题原因
- 你配置的
options.Conventions.AuthorizeFolder是Razor Pages专属的授权约定,仅对物理存放在/Pages/client路径下的.cshtmlRazor页面生效。而Blazor Server采用的是客户端组件路由,所有访问路径最终都会回退到/_Host.cshtml这一个Razor页面渲染,你给/client文件夹加的授权规则根本不会被触发。 - Blazor自身的路由系统默认不会自动继承Razor Pages的授权配置,没有额外配置的情况下所有路由都是公开可访问的。
修复步骤
1. 替换Blazor路由组件为带授权校验的版本
打开App.razor,将默认的RouteView替换为AuthorizeRouteView,同时配置未授权用户的跳转逻辑:
<CascadingAuthenticationState> <Router AppAssembly="@typeof(App).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <NotAuthorized> @if (context.User.Identity?.IsAuthenticated == false) { <RedirectToLogin /> } else { <p>权限不足,无法访问当前页面</p> } </NotAuthorized> </AuthorizeRouteView> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> <NotFound> <PageTitle>404 未找到</PageTitle> <LayoutView Layout="@typeof(MainLayout)"> <p>抱歉,你访问的页面不存在</p> </LayoutView> </NotFound> </Router> </CascadingAuthenticationState>
新增Shared/RedirectToLogin.razor组件实现登录跳转:
@inject NavigationManager NavManager @code { protected override void OnInitialized() { NavManager.NavigateTo($"Identity/Account/Login?returnUrl={Uri.EscapeDataString(NavManager.Uri)}", forceLoad: true); } }
2. 给/client路径的Blazor页面添加角色校验
所有路由前缀为/client的Blazor页面组件顶部,添加角色授权属性即可:
@attribute [Authorize(Roles = "Owners")] @page "/client/dashboard" @* 其余页面内容 *@
如果/client下的页面都存放在独立的文件夹中,也可以直接在该文件夹下的_Imports.razor里统一加@attribute [Authorize(Roles = "Owners")],不需要每个页面重复加。
可选清理
你之前配置的options.Conventions.AuthorizeFolder("/client", "Owners")对Blazor路由完全无效,可以直接删除。
内容的提问来源于stack exchange,提问作者Zoinky
相关产品推荐
相关产品推荐

