如何在Asp.Net Core中添加非用户类代理的令牌身份认证方案?
服务账号(机器代理)认证方案解答
1. 模式名称
这种专为无人值守非人类实体设计的认证模式,行业内通常称为服务账号(Service Account)或机器账号(Machine Account),核心是和普通用户账号做明确区分,用于服务、代理、脚本这类自动化程序的身份认证。
2. Asp.Net Core Identity适配性
可以基于Asp.Net Core Identity扩展实现,但也有更轻量的替代方案,具体看需求:
- 基于Identity扩展:新增独立的
ServiceAccount实体类,和IdentityUser完全分离存储,再自定义专属认证逻辑。这种方式可复用Identity部分基础设施,但需要额外扩展实体和认证流程。 - 独立实现自定义认证:如果不想改动现有Identity用户体系,直接单独实现一个自定义认证Handler更合适,和现有JWT认证并行,互不干扰,侵入性更低。
3. 并行实现思路
步骤1:新增自定义认证方案
实现AuthenticationHandler<AuthenticationSchemeOptions>子类,处理代理认证逻辑:
- 从请求头(比如
X-Service-Token)读取认证凭证; - 验证凭证有效性:从独立的服务账号表中查询匹配记录,校验哈希后的密钥/令牌;
- 验证通过后,生成包含服务账号标识、权限的
ClaimsPrincipal。
步骤2:配置多认证方案
在Program.cs中,除原有JWT认证,注册新的自定义认证方案:
builder.Services.AddAuthentication() .AddJwtBearer(options => { /* 原有用户JWT配置 */ }) .AddScheme<AuthenticationSchemeOptions, ServiceAccountAuthenticationHandler>( "ServiceAccountAuth", options => { /* 自定义认证配置 */ });
步骤3:区分授权策略
给需要代理访问的接口指定授权策略,要求使用服务账号认证方案:
[Authorize(AuthenticationSchemes = "ServiceAccountAuth")] [HttpPost("/api/agent/perform-task")] public IActionResult AgentTask() { // 代理专属接口逻辑 }
普通用户接口保持原有[Authorize](默认使用JWT方案)即可。
步骤4:服务账号存储
创建独立数据库表存储服务账号信息,字段至少包含:
- 唯一ID
- 密钥/令牌的哈希值(禁止明文存储)
- 权限范围(比如可访问的API列表)
- 创建时间、最后使用时间(用于审计)
安全注意事项
- 长期凭证必须通过安全方式分发和存储,比如环境变量、密钥管理工具,绝对不能硬编码在代码或配置文件中;
- 遵循最小权限原则,给服务账号分配刚好够用的权限;
- 即使是“永不失效”,也要设计密钥轮换机制,避免凭证泄露后造成永久风险。
内容的提问来源于stack exchange,提问作者J4N
相关产品推荐
相关产品推荐

