ASP.Net Core 2默认认证方案被忽略,自定义认证处理器遇阻
实现ASP.NET Core 2自定义AuthenticationHandler完整指南
看起来你已经迈出了自定义认证Handler的第一步,我来帮你把剩余的部分补全,并且梳理清楚关键要点:
1. 先完善常量定义
首先把你的认证方案常量统一管理起来,避免硬编码:
public static class Constants { public const string NoOpSchema = "NoOp"; }
2. 创建自定义认证选项类
这个类用来存储你的认证方案的配置参数,继承自AuthenticationSchemeOptions:
public class NoOpAuthenticationOptions : AuthenticationSchemeOptions { // 这里可以添加你的自定义配置项,比如: // public string ApiKeyHeaderName { get; set; } = "X-Api-Key"; }
3. 实现核心的AuthenticationHandler
这是自定义认证的核心,需要继承AuthenticationHandler<T>并实现HandleAuthenticateAsync方法——所有认证逻辑都在这里完成:
public class NoOpAuthenticationHandler : AuthenticationHandler<NoOpAuthenticationOptions> { // 构造函数需要注入必要的依赖 public NoOpAuthenticationHandler( IOptionsMonitor<NoOpAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { } // 核心认证逻辑方法 protected override Task<AuthenticateResult> HandleAuthenticateAsync() { // 这里写你的自定义认证逻辑,比如从请求头提取凭证、验证合法性等 // 示例:模拟一个通过认证的场景 var claims = new List<Claim> { new Claim(ClaimTypes.Name, "Matthias"), new Claim(ClaimTypes.Role, "Developer") }; // 创建身份标识和认证票据 var identity = new ClaimsIdentity(claims, Scheme.Name); var principal = new ClaimsPrincipal(identity); var ticket = new AuthenticationTicket(principal, Scheme.Name); // 返回认证成功结果 return Task.FromResult(AuthenticateResult.Success(ticket)); // 如果认证失败,返回失败结果: // return Task.FromResult(AuthenticateResult.Fail("无效的认证凭证")); // 如果不需要处理当前请求的认证,返回无结果: // return Task.FromResult(AuthenticateResult.NoResult()); } // 可选:重写挑战逻辑,处理未认证请求 protected override Task HandleChallengeAsync(AuthenticationProperties properties) { // 比如返回401未授权状态码 Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.CompletedTask; } }
4. 完整的服务注册代码
把你的注册代码补全,添加自定义方案的注册:
services.AddAuthentication(options => { options.DefaultScheme = Constants.NoOpSchema; options.DefaultAuthenticateScheme = Constants.NoOpSchema; options.DefaultChallengeScheme = Constants.NoOpSchema; options.DefaultSignInScheme = Constants.NoOpSchema; }) // 注册自定义认证方案,关联选项类和Handler类 .AddScheme<NoOpAuthenticationOptions, NoOpAuthenticationHandler>( Constants.NoOpSchema, options => { // 这里可以配置你的自定义选项,比如: // options.ApiKeyHeaderName = "X-Custom-Key"; });
5. 启用认证中间件
在Startup.cs的Configure方法中,一定要把UseAuthentication放在UseMvc之前,否则认证逻辑不会生效:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 其他中间件... // 启用认证中间件 app.UseAuthentication(); app.UseMvc(); }
关键注意事项
- 如果你的认证方案不是全局默认方案,需要在Controller或Action上用
[Authorize(AuthenticationSchemes = Constants.NoOpSchema)]指定要使用的认证方案 HandleAuthenticateAsync是认证的核心入口,所有凭证提取、验证逻辑都要在这里实现,比如从请求头、Cookie、QueryString等位置获取认证信息- 可以根据业务需求重写
HandleForbiddenAsync(处理无权限请求)、HandleSignInAsync(处理登录逻辑)等方法来扩展功能
内容的提问来源于stack exchange,提问作者Matthias Müller
相关产品推荐
相关产品推荐

