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

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场景:

  1. 定义授权需求和处理程序
// 授权需求
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;
    }
}
  1. 在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>();
}
  1. 调整自定义特性(可选,保留原有使用习惯)
// 去掉IAsyncAuthorizationFilter的实现,直接指定关联策略
public class AuthorizeAltasAttribute : AuthorizeAttribute
{
    public AuthorizeAltasAttribute()
    {
        Policy = "AltasPolicy";
    }
}
  1. 配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:15:00