You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:30:56