基于Asp Net Zero 12.0.0的用户鉴权分离微服务方案实现咨询
基于Asp Net Zero 12.0.0的认证授权分离微服务实现思路
一、核心架构拆分
- 直接把原Asp Net Zero项目拆成两个核心部分:用户中心服务,保留Identity模块、权限管理、角色/用户组管理、用户管理这些核心功能,彻底剥离业务代码,专注做统一认证授权;业务项目,只保留自身业务逻辑,删掉原有的Identity相关模块,所有用户、权限、认证逻辑完全依赖用户中心。
二、认证机制落地(基于JWT)
- 用户中心沿用Asp Net Zero自带的JWT生成逻辑,确保Token里包含用户ID、角色、权限集合、租户信息(如果用多租户),还要加个服务标识字段,用来区分不同业务服务的权限范围。
- 业务项目配置JWT验证,在
Program.cs里配置AddJwtBearer,把Authority设为用户中心的地址,关闭本地验证,完全靠用户中心的公钥或验证接口校验Token合法性。 - 业务项目的登录直接跳转到用户中心的登录页,登录成功后用户中心带着Token跳转回业务项目,业务项目把Token存在本地(比如Cookie或Storage),后续请求都带上这个Token。
三、授权与权限管理
- 在用户中心扩展权限配置,新增业务服务专属权限组,比如给业务项目的每个接口、页面配对应的权限码(例如
Business_Order_Create),管理员在用户中心给角色、用户分配这些权限。 - 用户中心提供权限查询API,业务项目启动时或者定时调用这个API拉取所有业务相关权限列表,缓存到本地(Redis或内存缓存都行),别每次请求都去调用用户中心,影响性能。
- 重写业务项目里的
PermissionChecker类,替换原有的本地权限验证逻辑:要么从本地缓存取当前用户的权限集合,要么直接调用用户中心API获取,实现基于用户中心的权限校验。 - 业务项目的细粒度权限(比如某个按钮),同样在用户中心配对应的权限码,前端调用用户中心的权限查询接口来控制按钮显示隐藏,不用自己维护权限列表。
四、数据同步与一致性保障
- 用户中心的用户、角色、权限变更时,用Asp Net Zero内置的EventBus推送变更通知给业务项目,业务项目收到通知后立刻更新本地缓存的权限、用户数据。
- 加个定时全量同步的兜底机制,比如每天凌晨跑一次全量同步,防止因为网络问题导致事件推送失败,数据不一致。
- 如果业务项目需要存用户基础信息(比如昵称、头像),可以在用户首次登录时从用户中心拉取并存到本地数据库,后续靠事件推送更新。
五、Angular前端适配
- 业务项目的Angular端删掉原来的登录、用户管理组件,登录入口直接跳用户中心的登录页,用SSO模式,登录成功后用户中心跳转回业务项目并带Token。
- 前端的权限控制(菜单、按钮)改成调用用户中心的权限查询接口,在
AppComponent初始化时拉取当前用户的权限列表,存在前端Storage里。 - 复用Asp Net Zero的
*abpPermission指令,但改一下指令的权限判断逻辑,从前端缓存的权限集合里校验,不用本地配置。
六、关键注意点
- 用户中心和业务项目之间的API调用必须用HTTPS,业务项目调用用户中心API时用Client Credentials模式的JWT做服务间认证,防止非法调用。
- 处理Token过期:前端监听Token过期事件,自动跳用户中心重新登录。
- 多租户场景下,要确保Token里的租户信息正确传递,业务项目根据租户ID做数据隔离。
内容的提问来源于stack exchange,提问作者Saleh Ahmadi
相关产品推荐
相关产品推荐

