You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:08:27