BlazorServer页面权限校验失败时如何终止执行并显示NotAuthorized提示
解决方法
你之前单独调用NavigationManager.NavigateTo无法终止页面执行,是因为该方法只会异步触发导航事件,不会打断当前同步代码的执行流程,也无法直接触发AuthorizeRouteView的<NotAuthorized>节点渲染。可以按下面的逻辑修改:
第一步:修改CheckUserPermission方法逻辑
权限校验不通过时直接抛出AuthorizationException异常,立刻终止当前代码执行:
using Microsoft.AspNetCore.Authorization; public static class MyHelper { public static void CheckUserPermission() { // 保留你原有的权限判断逻辑 bool hasPermission = 你的权限校验逻辑; if (!hasPermission) { // 抛出授权异常终止后续代码执行 throw new AuthorizationException(); } } }
第二步:全局捕获授权异常,复用无权限提示内容
首先把你写在<NotAuthorized>里的提示内容抽成独立的组件,比如Shared/NotAuthorizedTip.razor,内容就是你原来的提示:
权限不足时我想要展示的提示信息
然后修改App.razor,外层套ErrorBoundary组件捕获全局异常,遇到授权异常时直接渲染刚才抽离的无权限提示组件,和AuthorizeRouteView复用同一套内容:
<ErrorBoundary> <ChildContent> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <NotAuthorized> <NotAuthorizedTip /> </NotAuthorized> </AuthorizeRouteView> </ChildContent> <ErrorContent Context="errorCtx"> @if (errorCtx.Exception is AuthorizationException) { <!-- 授权异常直接渲染和路由校验一致的无权限提示 --> <NotAuthorizedTip /> } else { <!-- 其他异常可以保留原有报错逻辑 --> <h1>系统异常</h1> } </ErrorContent> </ErrorBoundary>
如果不想抽组件,也可以在校验失败后调用导航并抛出异常终止执行,你需要把NavigationManager注入到辅助方法里:
public static void CheckUserPermission(NavigationManager navManager) { bool hasPermission = 你的权限校验逻辑; if (!hasPermission) { // 你可以跳转到任何你想要的路由,也可以跳转到系统自带的禁止访问路由 navManager.NavigateTo("/access-denied"); // 抛出异常立刻终止后续代码执行 throw new OperationCanceledException(); } }
然后在页面调用的时候传入注入的NavigationManager实例即可。
内容的提问来源于stack exchange,提问作者Bob5421
相关产品推荐
相关产品推荐

