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

如何为API端点默认应用自定义授权且不影响Blazor页面

解决方案

要实现仅对/api开头的所有API端点默认应用自定义授权,同时不影响Blazor页面,你可以通过路由组级别的授权策略绑定来实现,替代全局FallbackPolicy或错误的控制器全局策略配置。

步骤1:定义自定义授权策略

先在Program.cs中注册你的自定义授权策略,比如你提到的Token策略,在里面实现你的授权逻辑:

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Token", policy =>
    {
        // 基础要求:必须是已认证用户
        policy.RequireAuthenticatedUser();
        
        // 这里添加你的自定义授权规则,比如:
        // 要求特定声明:policy.RequireClaim("ApiAccess", "Allowed");
        // 或绑定自定义授权需求:policy.AddRequirements(new YourCustomRequirement());
    });
});

// 如果用了自定义授权需求,记得注册对应的处理程序
// builder.Services.AddScoped<IAuthorizationHandler, YourCustomRequirementHandler>();

步骤2:为API控制器路由组绑定策略

在配置端点时,专门针对/api开头的控制器路由应用Token策略,而Blazor的端点保持独立配置:

// 先配置API控制器,绑定Token策略
app.MapControllers()
    .RequireAuthorization("Token");

// 再配置Blazor相关端点,无需添加授权策略
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

步骤3:验证AllowAnonymous特性生效

对于需要跳过授权的单个API端点,直接添加[AllowAnonymous]特性即可,框架会自动忽略路由组的授权要求:

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    // 这个端点会跳过Token授权
    [AllowAnonymous]
    [HttpGet("public")]
    public IActionResult GetPublicData()
    {
        return Ok("Public content");
    }

    // 这个端点会强制应用Token授权
    [HttpGet("protected")]
    public IActionResult GetProtectedData()
    {
        return Ok("Protected content");
    }
}

为什么之前的方法无效?

  • FallbackPolicy问题:FallbackPolicy是全局生效的,会覆盖所有端点(包括Blazor的Hub和页面路由),而Blazor页面的@attribute [AllowAnonymous]可能因为端点处理优先级问题未被正确识别,导致无法访问。
  • MapControllers策略未生效:大概率是策略配置逻辑有问题(比如没添加RequireAuthenticatedUser,或自定义需求未正确实现),或者路由映射顺序错误(比如Blazor路由配置在API之前,导致API策略未被正确应用)。

注意事项

  • 确保所有API控制器的路由都以/api开头(通过[Route("api/[controller]")]配置),这样才会被MapControllers()的策略覆盖。
  • 如果需要更精细的路由匹配,可以用MapGroup来限定/api路径,再绑定策略:
    app.MapGroup("/api")
       .MapControllers()
       .RequireAuthorization("Token");
    

内容的提问来源于stack exchange,提问作者jade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:35:17