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"。