ASP.NET Core 2.0中授权在JWT认证前触发的问题排查
实现ASP.NET Core 2.0自定义授权策略的实用方案
先给你点个赞——你在CustomAuthorizationHandler里添加的未认证用户拦截逻辑非常合理!未认证用户本来就不该访问需要授权的控制器操作,提前做这个检查不仅能避免后续无效的授权逻辑执行,还能通过日志清晰记录拦截原因,完全是正确的思路。
下面我把完整的实现流程梳理清楚,方便你参考落地:
1. 自定义授权处理器与需求的实现
先完善你的CustomAuthorizationHandler,搭配自定义授权需求类,让逻辑更规范:
public class CustomAuthorizationHandler : AuthorizationHandler<CustomAuthorizationRequirement> { private readonly ILogger<CustomAuthorizationHandler> _logger; public CustomAuthorizationHandler(ILogger<CustomAuthorizationHandler> logger) { _logger = logger; } protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement) { // 优先拦截未认证用户 if (!context.User.Identity.IsAuthenticated) { _logger.LogInformation("Failed to authorize user. User is not authenticated."); return Task.CompletedTask; } // 这里添加你的自定义授权检查逻辑,示例为检查特定权限声明 if (context.User.HasClaim(c => c.Type == "Permission" && c.Value == requirement.RequiredPermission)) { // 满足需求则标记授权通过 context.Succeed(requirement); } else { _logger.LogInformation("Failed to authorize user. Missing required permission: {Permission}", requirement.RequiredPermission); } return Task.CompletedTask; } } // 自定义授权需求,可携带业务参数 public class CustomAuthorizationRequirement : IAuthorizationRequirement { public string RequiredPermission { get; set; } public CustomAuthorizationRequirement(string requiredPermission) { RequiredPermission = requiredPermission; } }
2. 配置JWT Bearer认证与自定义授权策略
在Startup.cs的ConfigureServices方法中,完成认证和授权的注册配置:
public void ConfigureServices(IServiceCollection services) { // 配置JWT Bearer认证 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "your-issuer", // 替换为你的实际Issuer ValidAudience = "your-audience", // 替换为你的实际Audience IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secure-secret-key")) // 替换为你的密钥 }; }); // 注册自定义授权策略 services.AddAuthorization(options => { options.AddPolicy("ManageResourcesPolicy", policy => policy.Requirements.Add(new CustomAuthorizationRequirement("ManageResources"))); }); // 注入自定义授权处理器 services.AddScoped<IAuthorizationHandler, CustomAuthorizationHandler>(); services.AddMvc(); }
3. 在控制器中应用授权策略
最后,在需要保护的控制器或操作上标注对应的授权策略:
[Authorize(Policy = "ManageResourcesPolicy")] public class ResourceController : Controller { public IActionResult Index() { return View(); } }
几个关键注意事项:
- 务必在
Configure方法中启用认证中间件,且要放在UseMvc之前:app.UseAuthentication(); - JWT配置中的Issuer、Audience、密钥必须和生成Token时的配置完全一致,否则会认证失败
- 自定义授权逻辑可以根据业务需求灵活扩展,比如检查用户角色、关联数据库权限表等
内容的提问来源于stack exchange,提问作者cdarrigo
相关产品推荐
相关产品推荐

