mcpField
A
auth0-aspnetcore-api

auth0-aspnetcore-api

github.com/auth0安全55490 次安装1 天前更新
代码仓库

关于 auth0-aspnetcore-api

auth0-aspnetcore-api 为 ASP.NET Core Web API 集成 Auth0 JWT 访问令牌验证,适用于构建受保护 API 的 .NET 开发者。它支持 Minimal API 和控制器端点,并提供 DPoP 令牌绑定配置。

主要功能

  1. 01验证 Auth0 JWT 访问令牌
  2. 02保护 Minimal API 路由
  3. 03保护控制器操作
  4. 04配置基于 scope 的授权
  5. 05支持 DPoP 令牌绑定
  6. 06访问底层 JWT Bearer 选项

适用场景

  1. 01为 ASP.NET Core API 端点添加身份验证
  2. 02限制 Minimal API 路由的访问
  3. 03按 scope 控制 API 权限
  4. 04为令牌配置 DPoP 绑定

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/auth0/agent-skills --skill auth0-aspnetcore-api

安装后在 Claude Code 中输入/auth0-aspnetcore-api确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
api.md
integration.md
setup.md

详细介绍

Auth0 ASP.NET Core Web API 集成

使用 Auth0.AspNetCore.Authentication.Api,通过 JWT 访问令牌验证保护 ASP.NET Core Web API 端点。


前提条件

  • .NET 8.0 SDK 或更高版本
  • 已配置 Auth0 API(不是 Application,必须是 API 资源)
  • 如果尚未设置 Auth0,请先使用 auth0-quickstart 技能

不适用场景

  • 服务器渲染的 Web 应用 - MVC/Razor Pages 应用请使用基于会话的身份验证(Auth0.AspNetCore.Authentication)
  • 单页应用 - 客户端身份验证请使用 auth0-react、auth0-vue 或 auth0-angular
  • 移动应用 - React Native/Expo 请使用 auth0-react-native
  • Blazor WebAssembly - 需要采用不同的身份验证方式(OIDC 客户端身份验证)

快速入门工作流

1. 安装 SDK
dotnet add package Auth0.AspNetCore.Authentication.Api
2. 创建 Auth0 API

你需要在 Auth0 中创建一个 API(而不是 Application)。

停止 — 继续之前先询问用户。

仅询问以下问题,并等待用户回答后再进行其他操作:

"你希望如何创建 Auth0 API 资源?

  1. 自动 — 我会运行 Auth0 CLI 脚本来创建资源,并自动将确切的值写入 appsettings.json。
  2. 手动 — 你在 Auth0 Dashboard 中自行创建 API(或通过 auth0 apis create 创建),并向我提供 Domain 和 Audience。

你更倾向于哪种方式?(1 = 自动 / 2 = 手动)"

在用户回答之前,不要继续任何设置步骤。不要默认选择手动方式。

如果用户选择自动方式,请按照设置指南中的完整 CLI 脚本操作。自动方式会为你写入 appsettings.json — 跳过下面的步骤 3,直接继续步骤 4。

如果用户选择手动方式,请按照设置指南(手动设置部分)中的完整说明操作,包括 User Secrets 和环境变量选项。然后继续下面的步骤 3。

手动创建 API 的快速参考:

# Using Auth0 CLI
auth0 apis create \
  --name "My ASP.NET Core API" \
  --identifier https://my-api.example.com

或者在 Auth0 Dashboard → Applications → APIs 中手动创建

3. 配置 appsettings.json
{
  "Auth0": {
    "Domain": "your-tenant.auth0.com",
    "Audience": "https://my-api.example.com"
  }
}

重要: Domain 不能包含 https://。该库会自动构造 authority URL。

4. 配置 Program.cs
var builder = WebApplication.CreateBuilder(args);

// Register Auth0 JWT validation
builder.Services.AddAuth0ApiAuthentication(options =>
{
    options.Domain = builder.Configuration["Auth0:Domain"];
    options.JwtBearerOptions = new JwtBearerOptions
    {
        Audience = builder.Configuration["Auth0:Audience"]
    };
});

builder.Services.AddAuthorization();

var app = builder.Build();

// Middleware order matters: authentication before authorization
app.UseAuthentication();
app.UseAuthorization();

// Add your endpoints here (see Step 5)
app.MapGet("/api/public", () => Results.Ok(new { message = "Public" }));

app.Run();
5. 保护端点

Minimal API:

// Public endpoint - no authentication
app.MapGet("/api/public", () => Results.Ok(new { message = "Hello from a public endpoint!" }));

// Protected endpoint - requires valid JWT
app.MapGet("/api/private", (HttpContext ctx) =>
{
    var userId = ctx.User.FindFirst("sub")?.Value;
    return Results.Ok(new { message = "Hello from a protected endpoint!", userId });
}).RequireAuthorization();

基于控制器:

[ApiController]
[Route("api")]
public class MessagesController : ControllerBase
{
    [HttpGet("public")]
    public IActionResult Public() =>
        Ok(new { message = "Hello from a public endpoint!" });

    [Authorize]
    [HttpGet("private")]
    public IActionResult Private() =>
        Ok(new { message = "Hello from a protected endpoint!", userId = User.FindFirst("sub")?.Value });
}
6. 测试 API

测试公开端点:

curl http://localhost:5000/api/public

测试受保护端点(需要访问令牌):

curl http://localhost:5000/api/private \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

通过 Client Credentials 流程或 Auth0 Dashboard → APIs → Test 选项卡获取测试令牌。


常见错误

错误修正方法
Domain 包含 https://仅使用 your-tenant.auth0.com 格式 — 不带方案前缀
Audience 与 API Identifier 不匹配必须与 Auth0 Dashboard 中设置的 API Identifier 完全一致
在 Auth0 中创建了 Application,而不是 API必须在 Auth0 Dashboard → Applications → APIs 中创建 API 资源
中间件顺序错误UseAuthentication() 必须位于 UseAuthorization() 之前
使用了 ID token,而不是 access tokenAPI 身份验证必须使用 access token,而不是 ID token
本地 HTTPS 证书错误运行 dotnet dev-certs https --trust

基于 Scope 的授权

有关如何定义和强制执行 scope 策略,请参阅集成指南。


DPoP 支持

内置符合 RFC 9449 的持有证明令牌绑定。有关配置,请参阅集成指南。


相关技能

  • auth0-quickstart - Auth0 基础设置
  • auth0-mfa - 添加多重身份验证
  • auth0-cli - 在终端中管理 Auth0 资源

快速参考

配置选项:

  • options.Domain - Auth0 租户域名,不带 https:// 前缀(必需)
  • options.JwtBearerOptions.Audience - Auth0 API 设置中的 API 标识符(必需)
  • options.JwtBearerOptions - 完全访问底层 Microsoft JWT Bearer 选项

用户声明:

  • ctx.User.FindFirst("sub")?.Value - 用户 ID(主体)
  • ctx.User.FindFirst("scope")?.Value - 以空格分隔的作用域
  • ctx.User.FindAll("scope") - 所有作用域声明

常见用例:

  • 保护 Minimal API 路由 → .RequireAuthorization()(参见步骤 5)
  • 保护控制器操作 → [Authorize] 特性(参见步骤 5)
  • 作用域强制执行 → 集成指南
  • DPoP 令牌绑定 → 集成指南
  • 高级 JWT Bearer 配置 → API 参考

详细文档


参考资料

评论

支持 Markdown