需手动创建自定义 Authentication Handler,方法包括:一、继承 AuthenticationHandler<TOptions> 重写 HandleAuthenticateAsync;二、实现 IAuthenticationSignInHandler 补充签入逻辑;三、利用 JwtBearerEvents 扩展校验;四、直接实现 IAuthenticationHandler 接口;五、结合策略授权分离认证与业务规则。

如果您需要在 ASP.NET Core 应用中实现非标准身份验证逻辑(如基于自定义 Token、硬件设备签名、或特定协议头校验),则需手动创建自定义 Authentication Handler。以下是实现此功能的多种方法:
一、继承 AuthenticationHandler<TOptions> 并重写 HandleAuthenticateAsync
这是最基础且灵活的方式,适用于完全控制认证流程的场景。您需定义选项类、处理器类,并注册到服务容器中。
1、创建自定义选项类,继承 AuthenticationSchemeOptions。
2、创建处理器类,继承 AuthenticationHandler<CustomAuthOptions>,并重写 HandleAuthenticateAsync 方法。
3、在 HandleAuthenticateAsync 中解析请求头(如 X-Custom-Signature)、验证签名有效性、构造 ClaimsIdentity。
4、若验证成功,调用 Succeeded(new AuthenticationTicket(principal, scheme)); 否则调用 Fail("reason")。
5、在 Program.cs 中通过 AddAuthentication().AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom", ...) 注册方案。
二、使用 IAuthenticationSignInHandler 实现登录态绑定逻辑
当自定义认证需与 Cookie 或 JWT 等下游认证机制联动时,可配合 SignInManager 或直接实现签发逻辑。该方式不替代主认证处理器,而是补充签入行为。
1、定义一个类实现 IAuthenticationSignInHandler 接口。
2、在 SignInAsync 方法中,根据当前 HttpContext.User 的 ClaimsPrincipal 构造新的 ClaimsIdentity。
3、调用 HttpContext.SignInAsync("Cookies", principal, properties) 显式签入。
4、确保该处理器在 ConfigureService 中通过 services.AddSingleton<IAuthenticationSignInHandler, CustomSignInHandler>() 注册。
三、基于 JwtBearerEvents 扩展而非重写整个 Handler
若底层仍依赖 JWT 验证但需注入额外校验(如数据库 Token 黑名单、设备指纹比对),无需从头编写 Handler,而应利用内置 JwtBearerHandler 的事件扩展点。
1、配置 JwtBearerOptions 时设置 Events.OnTokenValidated。
2、在事件回调中获取 ValidationContext 和 ClaimsPrincipal。
3、执行额外检查:查询 数据库中该 jti 是否已被撤销 或比对 请求 IP 与原始登录 IP 是否一致。
4、若校验失败,抛出 SecurityTokenValidationException 以中断认证流程。
四、实现 IAuthenticationHandler 接口并手动注入上下文
适用于需彻底脱离基类约束、或与其他中间件深度耦合的极端场景。该方式放弃所有基类辅助逻辑(如自动 Challenge/Forbid 响应),完全由开发者控制。
1、定义类实现 IAuthenticationHandler 接口,显式实现 InitializeAsync、AuthenticateAsync、ChallengeAsync 等全部方法。
2、在 InitializeAsync 中保存 HttpContext 和 AuthenticationScheme。
3、在 AuthenticateAsync 中手动读取 Authorization 头、解析凭证、生成 AuthenticationTicket。
4、在 ChallengeAsync 中直接写入响应状态码 401 及自定义 WWW-Authenticate 头字段值。
5、注册时使用 AddAuthentication().AddScheme<AuthenticationSchemeOptions, RawCustomHandler>("RawCustom", ...)
五、组合策略:使用 Policy-based Authorization 配合自定义 Handler
当认证逻辑本身简单(如仅校验 Header 存在性),而授权规则复杂(如按租户、角色、操作类型动态判断),应将认证与授权分离,避免在 Handler 中混杂业务策略。
1、自定义 Handler 仅完成基础身份识别,例如提取并验证 X-Tenant-ID 头,构造含 TenantId 声明的 ClaimsPrincipal。
2、定义 IAuthorizationRequirement 及对应 AuthorizationHandler,例如 TenantRequirement 和 TenantAuthorizationHandler。
3、在控制器 Action 上应用 [Authorize(Policy = "TenantAdmin")],由策略系统统一执行细粒度判定。
4、确保策略所需的服务(如 ITenantService)已在 DI 容器中注册为 Scoped。










