SuperAPI AI 工具集

jwt

安全与审计

查看项目

更新于 10-16 03:53

技能介绍

JWT Authentication Skill。Sorcha 使用 JWT Bearer 身份验证,以 Tenant Service 作为令牌签发方。所有服务使用 Sorcha.ServiceDefaults 中共享的 JwtSettings 校验令牌。令牌支持三种类型:user(邮箱/密码)、service(客户端凭据)以及 delegated(服务代表用户行事)。

快速开始

服务身份验证设置(Program.cs,任意 Sorcha 服务):

var builder = WebApplication.CreateBuilder(args);

// 1. 添加 JWT 身份验证(开发环境自动生成共享密钥)
builder.AddJwtAuthentication();

// 2. 添加服务特定的授权策略
builder.Services.AddBlueprintAuthorization();

var app = builder.Build();

// 3. 关键:顺序很重要!
app.UseAuthentication();
app.UseAuthorization();

app.MapBlueprintEndpoints();
app.Run();

保护端点

// Minimal API 模式
group.MapPost("/", CreateBlueprint)
    .WithName("CreateBlueprint")
    .RequireAuthorization("CanManageBlueprints");

核心概念

  • Token Types:区分 user 与 service,token_type 声明为 "user" 或 "service"。
  • Organization Scope:隔离租户数据,令牌中的 org_id 声明。
  • Signing Key:对称 HMAC-SHA256,开发环境自动生成,生产环境使用 Azure Key Vault。
  • Token Lifetime:按类型可配置。Access 60 分钟,Refresh 24 小时,Service 8 小时。

常见模式

自定义授权策略,适用于端点需要基于角色之外的特定声明:

// AuthenticationExtensions.cs
options.AddPolicy("CanManageBlueprints", policy =>
    policy.RequireAssertion(context =>
    {
        var hasOrgId = context.User.Claims.Any(c => c.Type == "org_id" && !string.IsNullOrEmpty(c.Value));
        var isService = context.User.Claims.Any(c => c.Type == "token_type" && c.Value == "service");
        return hasOrgId || isService;
    }));

在处理器中提取声明,适用于端点逻辑需要用户/组织上下文:

async Task<IResult> HandleRequest(ClaimsPrincipal user, ...)
{
    var userId = user.FindFirst(JwtRegisteredClaimNames.Sub)?.Value;
    var orgId = user.FindFirst("org_id")?.Value;
    
    if (string.IsNullOrEmpty(orgId))
        return Results.Forbid();
    
    // 使用 orgId 进行数据隔离
}

另见

  • patterns:令牌生成、校验、策略。
  • workflows:设置、测试、故障排查。

相关技能

  • minimal-apis 技能:使用 .RequireAuthorization() 进行端点配置。
  • aspire 技能:通过 ServiceDefaults 进行共享配置。
  • redis 技能:令牌吊销跟踪。
  • yarp 技能:网关级身份验证。

文档资源

使用 Context7 获取最新的 JWT/身份验证文档。用法:使用 mcp__context7__resolve-library-id 搜索 "asp.net core authentication jwt";优先选择网站文档(ID 以 /websites/ 开头)而非源码仓库;使用解析后的库 ID 通过 mcp__context7__query-docs 查询。推荐查询:"JWT Bearer authentication setup"、"authorization policies claims"、"token validation parameters"。