ASP.NET Core中能否实现基于单个Action的身份验证处理程序
结论
完全可以实现,ASP.NET Core原生支持针对单个Controller/Action指定专属身份验证方案,无需修改全局通用的身份验证逻辑。
实现步骤
1. 注册所有身份验证方案
首先在Program.cs中同时注册全局通用方案、以及需要给少数路由使用的专属方案,示例代码如下:
var builder = WebApplication.CreateBuilder(args); // 注册全局默认的通用身份验证方案,示例用JWT builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 全局JWT常规配置,包括签发方、接收方、密钥等 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; }) // 注册专属身份验证方案,自定义方案名,示例为CustomAuth .AddScheme<CustomAuthOptions, CustomAuthHandler>("CustomAuth", options => { // 专属方案的独立配置项 }); builder.Services.AddControllers(); // 其余服务注册逻辑... var app = builder.Build(); // 中间件顺序保持默认即可,先启用身份验证、再启用授权 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 给指定Action绑定专属验证方案
直接在需要特殊身份验证的Action上,通过[Authorize]特性的AuthenticationSchemes参数指定要使用的方案即可,其余不加特殊配置的路由会自动沿用全局默认方案:
public class DemoController : ControllerBase { // 少数特殊路由:指定用专属的CustomAuth方案验证 [HttpGet("special-api")] [Authorize(AuthenticationSchemes = "CustomAuth")] public IActionResult SpecialApi() { return Ok("该接口使用专属身份验证机制"); } // 其余普通路由:直接用全局默认的JWT方案验证 [HttpGet("normal-api")] [Authorize] public IActionResult NormalApi() { return Ok("该接口使用全局通用身份验证机制"); } }
补充说明
- 专属的自定义验证处理程序
CustomAuthHandler需要继承AuthenticationHandler<TOptions>,自行实现HandleAuthenticateAsync方法的验证逻辑即可 - 如果要给某一组路由统一使用专属方案,可以直接把
[Authorize(AuthenticationSchemes = "CustomAuth")]标记在Controller类上,整个Controller下的所有Action都会复用该方案 - 如果需要同时支持多个验证方案,可直接用逗号分隔多个方案名,比如
[Authorize(AuthenticationSchemes = "CustomAuth,JwtBearer")] - 要跳过身份验证直接给对应Action/Controller标记
[AllowAnonymous]即可,优先级高于所有[Authorize]特性
内容的提问来源于stack exchange,提问作者Sency
相关产品推荐
相关产品推荐

