.NET Core 6多Web API跨项目调用认证方案咨询
.NET 6 内部WebAPI项目间调用认证最优实现方案
这个场景属于内网桌面客户端+服务间调用的混合场景,不要上过重的公网身份认证组件,优先选改造成本低、安全边界清晰、维护成本低的实现,具体落地逻辑如下:
核心选型:双策略JWT认证(用户登录/服务调用分离)
完全复用项目A现有登录认证体系,不做重构,新增独立的服务调用认证分支,和原有用户登录逻辑并行不冲突,不需要给项目B单独搭建登录模块。
具体实现步骤
- 项目A侧改造(认证提供方)
- 复用现有LiteDB实例,新建
InternalAppCredential集合,存储分配给项目B的凭证:主键为固定AppId,AppSecret存储加盐SHA256哈希值(绝对不要存明文),额外记录允许访问的内网IP段。 - 在
Program.cs的JWT认证配置中新增独立授权策略,命名为InternalServiceAccess,专门校验服务调用签发的JWT,原有前端用户登录的校验逻辑完全保留,两套策略互不干扰。 - 新增一个无认证的凭证换发接口
/api/auth/internal/token,逻辑为:接收请求传入的AppId、AppSecret、请求源IP,首先校验IP是否在对应AppId的白名单内,再校验AppSecret哈希值是否匹配,校验通过后签发有效期15分钟的短期JWT,JWT内仅写入appType=ProjectB、scope=allowed_biz_api两个必要声明,不携带任何用户敏感信息,权限范围仅限B需要调用的业务接口,不开放全量接口访问权限。 - 所有给B开放的接口统一加
[Authorize(Policy = "InternalServiceAccess")]特性,和普通用户接口做权限隔离,同时单独留存服务调用日志(调用IP、时间、接口、返回码)到LiteDB,方便溯源。
- 复用现有LiteDB实例,新建
- 项目B侧改造(调用方,搭配Electron适配)
- 不需要搭建独立登录体系,将分配到的
AppId、AppSecret加密存储在Electron主进程配置中,绝对不要硬编码到Vue渲染层的JS代码里,渲染进程需要获取凭证时通过IPC和主进程通信,避免打包后前端代码被反编译泄露凭证。 - B启动时首先调用A的换发接口拿到短期JWT,存储在应用内存中(不要写入本地持久化文件),后续所有调用A接口的请求,都在Header中携带
Authorization: Bearer {token}。 - 加本地自动续期逻辑:每次发起请求前检查Token剩余有效期,不足3分钟时自动重新调用换发接口获取新Token,全程不需要用户感知。
- 不需要搭建独立登录体系,将分配到的
- 轻量化安全加固(适配内网场景)
- A侧的内部Token换发接口、所有服务专属接口,都加IP白名单校验,仅允许B所在的固定内网IP访问,就算凭证意外泄露,非白名单IP也无法调用。
- 服务调用JWT的签名密钥定期轮换(比如每3个月换一次),轮换时提前更新B的配置即可,不需要停服。
- 接口请求加时间戳校验,B发起请求时携带当前时间戳,A侧校验时间戳和服务器时间差超过5分钟的请求直接拒绝,防重放攻击。
不推荐其他方案的原因
- 直接传固定API Key:Key长期有效,一旦泄露没有失效机制,安全风险高
- 部署IdentityServer/OAuth2全套服务:两个轻量内部项目上这套架构维护成本太高,属于过度设计
- Windows域集成认证:对跨设备、跨系统环境适配差,Electron端兼容坑多,不适合桌面打包场景
这个方案整体改造量不超过2人日,完全兼容现有技术栈,不需要引入新的第三方依赖,后续如果B需要新增用户登录能力,直接在现有服务认证逻辑上叠加用户声明即可,不需要重构。
内容的提问来源于stack exchange,提问作者Khyati Desai
相关产品推荐
相关产品推荐

