如何在.net webapi中设置某些接口不参与 jwt校验
·
在 .NET 中,默认情况下,如果你启用了 JWT 认证和授权中间件(UseAuthentication 和 UseAuthorization),所有受保护的接口都会强制进行 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:
- 使用
[AllowAnonymous]属性:适用于单个接口或控制器,简单易用。 - 自定义中间件:适用于需要灵活控制多个路径的情况。
- Endpoint 路由规则:适用于基于路由的细粒度控制。
- 全局策略排除:适用于需要全局默认认证但排除特定路径的场景。
推荐优先使用 [AllowAnonymous],因为它是最简单且直观的方式。如果需要更复杂的控制,可以结合自定义中间件或 Endpoint 路由规则来实现。
更多推荐

所有评论(0)