ASP.NET Core 5 Blazor Server自定义授权属性不生效问题排查
问题原因
- 你实现的
AuthorizeAltasAttribute继承了IAsyncAuthorizationFilter,这是MVC管道专属的过滤器,仅当请求走控制器/API/Razor Pages路由时才会触发执行。 - Blazor Server除了首次页面加载走HTTP请求,后续交互都是通过SignalR的Blazor Hub长连接完成,不会走MVC过滤器管道,因此贴在Blazor页面上的该自定义特性逻辑永远不会被调用。
- Blazor本身仅识别原生的
[Authorize]特性,走自身的授权校验逻辑,不会处理自定义的MVC过滤器特性。
解决方法
推荐将自定义授权逻辑改造为ASP.NET Core标准授权策略,可同时兼容控制器和Blazor场景:
- 定义授权需求和处理程序
// 授权需求 public class AltasRequirement : IAuthorizationRequirement { } // 授权需求处理程序 public class AltasRequirementHandler : AuthorizationHandler<AltasRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AltasRequirement requirement) { if (!context.User.Identity.IsAuthenticated) { context.Fail(); return Task.CompletedTask; } var usuario = context.User.Identity.Name.Split("\\")[1].ToLower(); if (usuario == "josesito") { context.Succeed(requirement); } else { context.Fail(); } return Task.CompletedTask; } }
- 在Startup中注册授权策略和处理程序
public void ConfigureServices(IServiceCollection services) { // 原有配置保留,新增以下内容 services.AddAuthorization(options => { options.AddPolicy("AltasPolicy", policy => { policy.Requirements.Add(new AltasRequirement()); policy.AddAuthenticationSchemes(IISDefaults.AuthenticationScheme); }); }); services.AddSingleton<IAuthorizationHandler, AltasRequirementHandler>(); }
- 调整自定义特性(可选,保留原有使用习惯)
// 去掉IAsyncAuthorizationFilter的实现,直接指定关联策略 public class AuthorizeAltasAttribute : AuthorizeAttribute { public AuthorizeAltasAttribute() { Policy = "AltasPolicy"; } }
- 配置Blazor授权路由
确保App.razor使用AuthorizeRouteView并包裹CascadingAuthenticationState传递授权状态:
<CascadingAuthenticationState> <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <NotAuthorized> <p>无权限访问该页面</p> </NotAuthorized> </AuthorizeRouteView> </Found> <NotFound> <LayoutView Layout="@typeof(MainLayout)"> <p>访问的页面不存在</p> </LayoutView> </NotFound> </Router> </CascadingAuthenticationState>
改造完成后,你原有代码中Blazor页面和控制器上的[AuthorizeAltas]特性都可以正常生效。
内容的提问来源于stack exchange,提问作者Adrian Spinetta
相关产品推荐
相关产品推荐

