如何在Blazor中批量保护API端点,实现类似UI页面的权限控制?
一次性保护Blazor应用中所有/api端点的方法
要让所有/api端点像Blazor UI页面一样强制要求授权,你可以通过以下几步实现全局控制,无需逐个给控制器添加[Authorize]:
1. 添加全局授权过滤器
在Program.cs配置控制器服务时,添加全局授权过滤器,默认要求所有API端点必须经过认证:
builder.Services.AddControllers(options => { var authPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(authPolicy)); });
这会自动给所有API控制器的所有Action加上授权要求,未授权请求会直接被拦截。
2. 对齐API与UI的认证方案
因为你用的是基于Cookie的自定义AuthenticationStateProvider,需要确保API也使用相同的Cookie认证机制,保证前后端认证状态一致:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 配置Cookie名称,要和Blazor UI中使用的一致 options.Cookie.Name = "YourAppAuthCookie"; // API请求未授权时,返回401而不是重定向(适配API的无状态特性) options.Events.OnRedirectToLogin = context => { context.Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.CompletedTask; }; // 可根据需求添加其他Cookie配置,比如过期时间、SameSite属性等 });
3. 确保中间件顺序正确
中间件的执行顺序直接影响认证授权的生效,必须按以下顺序配置:
app.UseAuthentication(); // 先处理认证逻辑 app.UseAuthorization(); // 再处理授权校验 // 之后映射控制器和Blazor相关路由 app.MapControllers(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host");
4. 例外处理(可选)
如果有个别API端点需要允许匿名访问,只需在对应的控制器或Action上添加[AllowAnonymous]属性即可,它会覆盖全局的授权要求:
[AllowAnonymous] [ApiController] [Route("api/[controller]")] public class PublicController : ControllerBase { [HttpGet] public IActionResult GetPublicData() { return Ok("公开数据"); } }
这样配置后,所有/api端点会默认要求用户已认证,未授权请求会返回401状态码,和Blazor UI页面的权限保护逻辑保持一致。
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

