Blazor (Server)页面跳转问题:未识别AllowAnonymous属性及登录页跳转逻辑疑问
问题1:AllowAnonymous属性页面仍被重定向的原因与解决方案
原因
你将重定向逻辑写在全局共享的MainLayout.razor初始化生命周期中,布局的初始化逻辑优先级高于页面本身的权限校验逻辑,且你的现有代码没有读取当前页面的[AllowAnonymous]特性做判断,只要用户未登录就会触发跳转,自然覆盖了该特性的匿名访问许可效果。
修复方案
你可以通过级联参数获取当前路由对应的页面类型,提前判断是否标注了[AllowAnonymous],符合条件则跳过重定向,修改后的代码示例如下:
[Inject] public NavigationManager NavigationManager { get; set; } [Inject] public AuthenticationStateProvider AuthStat { get; set; } // 注入路由数据级联参数 [CascadingParameter] public RouteData RouteData { get; set; } protected async override Task OnInitializedAsync() { base.OnInitialized(); // 校验当前页面是否允许匿名访问 bool isAllowAnonymous = RouteData?.PageType? .GetCustomAttributes(inherit: true) .OfType<Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute>() .Any() ?? false; if (isAllowAnonymous) { return; } var user = (await AuthStat).User; if (!user.Identity.IsAuthenticated) { NavigationManager.NavigateTo($"Identity/Account/Register"); } }
问题2:仅Identity登录页面未触发重定向的底层逻辑
ASP.NET Core Identity 自带的/Identity/Account/Login、/Identity/Account/Register等页面属于Razor Pages(并非Blazor组件),默认使用Identity独立布局,不会继承你项目中的MainLayout.razor,因此写在MainLayout中的重定向逻辑完全不会作用到这两个页面上。
你当前代码的逻辑是所有触发MainLayout初始化的页面、且用户未登录就跳注册页,所以非Identity的普通页面(都用了MainLayout)都会触发跳转,只有Login、Register这两个Identity自带页面不会被逻辑命中,就出现了你观察到的表现。
内容的提问来源于stack exchange,提问作者Krzysztof Krysztofczyk
相关产品推荐
相关产品推荐

