在 .NET 中,默认情况下,如果你启用了 JWT 认证和授权中间件(UseAuthenticationUseAuthorization),所有受保护的接口都会强制进行 Token 校验。然而,有时你可能希望某些特定接口无需校验 Token,例如公开的 API 或健康检查接口。

以下是实现这一需求的几种方法:


1. 使用 [AllowAnonymous] 属性

最简单的方法是使用 [AllowAnonymous] 属性标记不需要校验 Token 的接口或控制器。这个属性会跳过认证和授权逻辑。

示例代码:
[ApiController]
[Route("api/[controller]")]
public class PublicController : ControllerBase
{
    [HttpGet("health-check")]
    [AllowAnonymous] // 跳过认证和授权
    public IActionResult HealthCheck()
    {
        return Ok(new { status = "Healthy" });
    }

    [HttpGet("secure-data")]
    [Authorize] // 需要认证和授权
    public IActionResult SecureData()
    {
        return Ok(new { message = "This is secure data!" });
    }
}
工作原理:
  • [AllowAnonymous] 是 ASP.NET Core 提供的一个特性,用于指示该接口或控制器不需要经过认证和授权。
  • 它会覆盖全局的授权策略。

2. 在 Policy 中排除特定路由

如果你希望在全局范围内排除某些特定路径(如 /api/health-check),可以通过配置 AuthorizationPolicy 来实现。

示例代码:

Program.cs 中,定义一个自定义的授权策略,并排除特定路径:

app.UseRouting();

// 自定义中间件:排除特定路径
app.Use(async (context, next) =>
{
    var path = context.Request.Path.ToString();
    if (path.StartsWith("/api/health-check"))
    {
        await next(); // 直接跳过认证和授权
        return;
    }

    // 对其他请求执行认证和授权
    await next();
});

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});
工作原理:
  • 自定义中间件会检查请求路径,如果匹配到指定的路径(如 /api/health-check),则直接跳过认证和授权逻辑。

3. 使用 Endpoint 路由规则

从 .NET Core 3.0 开始,你可以使用基于 Endpoint 的路由规则来控制哪些路由需要认证和授权。

示例代码:

Program.cs 中,为特定的路由禁用认证和授权:

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/api/health-check", () => Results.Ok(new { status = "Healthy" }))
             .AllowAnonymous(); // 允许匿名访问

    endpoints.MapControllers()
             .RequireAuthorization(); // 默认需要认证和授权
});
工作原理:
  • AllowAnonymous() 方法允许匿名访问指定的路由。
  • RequireAuthorization() 方法要求默认的所有控制器都需要认证和授权。

4. 配置全局策略并排除特定路径

如果你使用了全局授权策略(AddAuthorization),可以通过添加条件来排除特定路径。

示例代码:

Program.cs 中,配置全局授权策略,并通过 FallbackPolicy 排除特定路径:

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser() // 默认需要认证
        .Build();
});

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/api/health-check", () => Results.Ok(new { status = "Healthy" }))
             .AllowAnonymous(); // 允许匿名访问

    endpoints.MapControllers()
             .RequireAuthorization(); // 默认需要认证和授权
});
工作原理:
  • FallbackPolicy 定义了一个全局默认的授权策略。
  • 使用 AllowAnonymous() 可以覆盖全局策略,允许匿名访问特定路径。

5. 总结

可以选择以下方法来实现某些接口不校验 Token:

  1. 使用 [AllowAnonymous] 属性:适用于单个接口或控制器,简单易用。
  2. 自定义中间件:适用于需要灵活控制多个路径的情况。
  3. Endpoint 路由规则:适用于基于路由的细粒度控制。
  4. 全局策略排除:适用于需要全局默认认证但排除特定路径的场景。

推荐优先使用 [AllowAnonymous],因为它是最简单且直观的方式。如果需要更复杂的控制,可以结合自定义中间件或 Endpoint 路由规则来实现。

更多推荐