鉴权服务中心
在写任何代码之前,先理清**“我们要对外提供什么能力”(API 接口)以及“内部如何分工”**(模块规划),是架构设计的核心。
鉴于你的需求是**“独立一套鉴权服务器,管理 ERP、MES、WMS 等多系统的鉴权”**,我们需要将系统分为两大部分:
- OIDC 协议层:处理标准的 OpenID Connect 流程(颁发令牌、校验令牌、跳转登录),这部分主要是给**机器(浏览器、后端服务)**看的。
- 管理 API 层:用于后台管理(注册新的 ERP 系统、创建用户、分配权限),这部分是给管理员看的。
以下是基于 ABP 架构风格(DDD 分层)的模块规划和接口清单。
# 一、 模块职责规划 (Module Architecture)
根据你要求的工程结构,我们将职责分配如下:
# 1. AuthCenter.Domain (领域核心)
- 核心职责:定义“什么是一个客户端”、“什么是一个用户”。
- 包含内容:
AppUser/AppRole:用户与角色实体。ClientManager(Domain Service):封装 OpenIddict 的底层逻辑,提供业务语义的方法(如CreateMesClientAsync)。ScopeManager(Domain Service):管理资源定义(如定义 "wms-service" 资源)。
# 2. AuthCenter.Application (应用逻辑)
- 核心职责:作为 API 和 Domain 的中间人,处理 DTO 转换、输入校验。
- 包含内容:
ClientAppService:实现“注册 ERP”、“修改 MES 回调地址”等逻辑。IdentityAppService:实现“创建员工账号”、“重置密码”等逻辑。ScopeAppService:实现“添加新的 API 资源”逻辑。
# 3. AuthCenter.AuthServer.Host (宿主与接口)
- 核心职责:暴露 HTTP 接口,启动 OpenIddict 中间件。
- 包含内容:
- AuthorizationController:心脏部位。处理
/connect/token等标准 OIDC 请求。 - Management API Controllers:暴露给前端管理后台使用的 RESTful API。
- AuthorizationController:心脏部位。处理
# 二、 接口清单 (API List)
我们需要实现三类接口:标准协议接口、应用管理接口、身份管理接口。
# 1. OIDC 标准协议接口 (Protocol Endpoints)
这些接口通常不通过 Swagger 暴露给普通人看,而是写死在 ERP/MES 的配置文件中的。
| HTTP 方法 | 路由 (Endpoint) | 用途 | 备注 |
|---|---|---|---|
| GET | /.well-known/openid-configuration | 发现文档 | ERP 系统启动时调用此接口,获取公钥和配置信息。 |
| POST | /connect/token | 令牌交换 | 核心接口。用 密码/Code/ClientSecret 换取 JWT Token。 |
| GET/POST | /connect/authorize | 认证请求 | 浏览器跳转接口。ERP 发现未登录,跳到这里显示登录页。 |
| GET/POST | /connect/logout | 登出 | 销毁 Session,通知 ERP 登出。 |
| GET | /connect/userinfo | 用户信息 | ERP 拿到 Token 后,调用此接口获取用户的 Name, Email 等。 |
| POST | /connect/introspect | 令牌内省 | (可选) WMS 收到 Token 后,询问 AuthServer 这张票是否有效。 |
# 2. 应用客户端管理接口 (Client Management APIs)
这是为了满足你“配置不同的服务”的需求。你需要一个管理后台来调用这些接口。
对应服务:AuthCenter.Application.Clients.ClientAppService
| HTTP 方法 | 路由 | 接口名 | 参数示例 (DTO) | 用途 |
|---|---|---|---|---|
| POST | /api/app/clients | 注册应用 | { "clientId": "mes_web", "displayName": "MES系统", "type": "public" } | 注册一个新的系统接入鉴权中心。 |
| GET | /api/app/clients | 获取列表 | ?skipCount=0&maxResultCount=10 | 查看当前接入了哪些系统(ERP, WMS等)。 |
| GET | /api/app/clients/{id} | 获取详情 | {id} | 查看某个系统的详细配置(回调地址、密钥)。 |
| PUT | /api/app/clients/{id} | 更新应用 | { "redirectUris": ["https://mes.com/signin"] } | 当 MES 域名变更时,更新回调地址。 |
| DELETE | /api/app/clients/{id} | 删除应用 | {id} | 吊销某个系统的接入权限。 |
# 3. 资源/作用域管理接口 (Scope/Resource APIs)
用于定义“权限范围”。比如 WMS 系统有些接口只允许 MES 调用,不允许 ERP 调用。
对应服务:AuthCenter.Application.Scopes.ScopeAppService
| HTTP 方法 | 路由 | 接口名 | 参数示例 (DTO) | 用途 |
|---|---|---|---|---|
| POST | /api/app/scopes | 创建作用域 | { "name": "wms_api", "displayName": "WMS 后端接口全权" } | 定义一个新的权限标识。 |
| GET | /api/app/scopes | 获取作用域 | - | 列出所有可用的权限资源。 |
# 4. 身份管理接口 (Identity APIs)
用于管理实际登录的人(操作员)。
对应服务:AuthCenter.Application.Identity.IdentityAppService
| HTTP 方法 | 路由 | 接口名 | 参数示例 (DTO) | 用途 |
|---|---|---|---|---|
| POST | /api/identity/users | 创建用户 | { "userName": "zhangsan", "password": "..." } | 新员工入职开户。 |
| GET | /api/identity/users | 查询用户 | ?filter=zhang | 搜索用户。 |
| PUT | /api/identity/users/{id}/password | 重置密码 | { "newPassword": "..." } | 忘记密码处理。 |
# 三、 核心数据流向 (Data Flow)
为了让你理解各个模块怎么配合,我们设想一个场景:管理员在后台注册了一个新的 WMS 系统。
- API层 (Host):
- 管理员发送
POST /api/app/clients请求,Payload:{"clientId": "wms_backend", ...}。 ClientController接收请求。
- 管理员发送
- 应用层 (Application):
- Controller 调用
IClientAppService.CreateAsync(CreateClientDto input)。 ClientAppService做简单校验(如:ClientId 是否包含非法字符)。- 将
CreateClientDto转换为 OpenIddict 需要的描述符OpenIddictApplicationDescriptor。
- Controller 调用
- 领域层 (Domain) & 基础设施 (OpenIddict):
ClientAppService调用IOpenIddictApplicationManager.CreateAsync(descriptor)。- OpenIddict 的 Manager 内部会调用
OpenIddict.EntityFrameworkCore的 Store。 - Store 将数据写入数据库表
OpenIddictApplications。
# 四、 下一步计划
按照这个接口清单,我们的开发顺序建议如下:
- 第一阶段(基础建设):搭建
Domain和EF Core层,确保数据库能生成 OpenIddict 和 Identity 的表。(已在上一步涉及,但需细化配置)。 - 第二阶段(应用管理):实现 接口清单 2 (Client APIs)。因为没有 Client,鉴权就无从谈起。我们需要先写代码能把 ERP、MES 注册进去。
- 第三阶段(协议实现):实现 接口清单 1 (OIDC Endpoints)。核心是
AuthorizationController,让注册好的 Client 能拿到 Token。 - 第四阶段(界面与完善):如果需要,实现简单的登录 UI。
你是否同意这个接口清单和开发顺序?如果没问题,我们可以开始第一阶段的详细代码实现,专注于 Domain 实体的配置。
编辑 (opens new window)
上次更新: 2026/03/04, 04:11:12