基于ABP IO的单体应用模块间通信权限管控方案咨询
ABP IO 单体架构区分内外请求的可配置权限实现方案
1. 注入内部请求专属标识
基于ABP的C# Client Proxy扩展请求拦截逻辑,给所有模块间发起的内部请求统一注入加密的专属请求头,避免外部伪造:
- 重写
IClientProxyInterceptor接口,为所有内部请求添加X-Internal-Call请求头,值为预配置的内部通信密钥 - 密钥存放在应用配置中,不硬编码到业务代码里
示例代码:
public class InternalCallHeaderInterceptor : IClientProxyInterceptor { private readonly IConfiguration _config; public InternalCallHeaderInterceptor(IConfiguration config) { _config = config; } public Task InterceptAsync(ClientProxyInterceptionContext context) { context.Headers.Add("X-Internal-Call", _config["InternalCall:AuthKey"]); return Task.CompletedTask; } }
2. 全局请求来源识别中间件
在权限校验管道前添加全局中间件,统一识别请求来源并打标,后续所有权限逻辑都可以直接读取标记判断:
- 校验请求头
X-Internal-Call的值是否和配置的密钥一致,一致则标记为内部请求 - 标记结果存放在
HttpContext.Items中,贯穿整个请求生命周期
示例代码:
public class InternalCallIdentifyMiddleware { private readonly RequestDelegate _next; private readonly string _validInternalKey; public InternalCallIdentifyMiddleware(RequestDelegate next, IConfiguration config) { _next = next; _validInternalKey = config["InternalCall:AuthKey"]; } public async Task InvokeAsync(HttpContext context) { context.Items["IsInternalRequest"] = context.Request.Headers.TryGetValue("X-Internal-Call", out var headerVal) && headerVal == _validInternalKey; await _next(context); } }
3. 扩展权限校验逻辑适配双场景
基于ABP原生权限系统扩展,实现可配置的内外请求权限规则:
- 自定义权限配置节点,支持为每个接口配置是否允许内部调用、是否允许外部调用、外部调用所需权限
- 自定义授权过滤器,读取
HttpContext.Items中的请求来源标记,匹配对应接口的权限规则做校验
配置示例:
"PermissionRules": { "ProductService.GetDetail": { "AllowInternal": true, "AllowExternal": true, "ExternalRequiredPermission": "Product.View" }, "ProductService.UpdateStock": { "AllowInternal": true, "AllowExternal": false } }
4. 微服务迁移兼容处理
当前实现完全适配后续微服务架构演进:
- 拆分为微服务后,内部服务调用仍然沿用
X-Internal-Call头的校验逻辑,仅需要将密钥同步到所有微服务配置中 - 业务层的权限校验逻辑不需要做任何修改,实现平滑迁移
内容的提问来源于stack exchange,提问作者user17006190
相关产品推荐
相关产品推荐

