fengling-auth-service/.planning/codebase/ARCHITECTURE.md
movingsam 2a60caae80 docs(architecture): 添加系统架构分析文档
- 描述整体基于ASP.NET Core的分层架构与领域驱动设计
- 详细说明表现层、视图模型层、配置层和基础设施层职责
- 介绍用户认证、OAuth2授权码与令牌颁发的数据流过程
- 抽象说明用户与租户、声明和授权实体设计
- 说明应用启动入口和关键HTTP端点
- 列出错误处理策略和跨领域关注点(日志、追踪、安全)

docs(concerns): 新增代码库问题与关注点分析文档

- 汇总并详述安全漏洞如配置文件泄露、Cookie策略不当
- 记录技术债务包括缺乏单元测试、依赖注入不统一等
- 罗列性能问题和具体代码缺陷
- 给出优先级明确的修复建议和改进措施
- 涵盖架构设计问题和依赖兼容性风险
- 说明测试覆盖缺口及高风险未测试区域

docs(conventions): 新增编码约定与规范文档

- 明确文件、类、方法、变量等命名规则
- 规范代码风格包括命名空间、主构造函数使用
- 制定日志记录、审计日志和依赖注入的标准
- 规定控制器路由、异步模式和错误处理方式
- 说明DTO命名及特性使用规范
- 描述配置管理、注释规范及常用代码注释样例

docs(integrations): 添加外部系统集成文档

- 介绍数据库连接和PostgreSQL客户端库版本
- 描述身份认证与授权服务及默认用户信息
- 说明可观测性方案及OpenTelemetry组件
- 涵盖容器化部署相关Docker与Kubernetes配置
- 说明CI/CD流水线触发条件与构建流程
- 列出环境变量需求和主要API端点
- 强调生产环境密钥管理与安全存储机制
2026-03-01 11:28:44 +08:00

6.1 KiB
Raw Blame History

架构分析

分析日期: 2026-02-28

模式概述

整体架构: 基于 ASP.NET Core 的现代 Web 应用架构,采用分层设计结合领域驱动思想。

核心特性:

  • 使用 OpenIddict 实现 OAuth2/OIDC 授权服务器功能
  • 采用 ASP.NET Core Identity 进行用户身份管理
  • 基于 Entity Framework Core 进行数据访问
  • 支持多租户Tenant架构
  • 集成 MediatR 实现 CQRS 模式(通过共享基础设施包)

分层架构

1. 表现层Presentation Layer

位置: src/Controllers/src/Views/

职责:

  • 处理 HTTP 请求与响应
  • 渲染 Razor 视图
  • 用户交互界面

关键控制器:

  • AccountController:用户登录、注册、登出
  • AuthorizationControllerOAuth2 授权端点
  • TokenController:令牌颁发端点
  • DashboardController:用户仪表板
  • UsersControllerRolesControllerTenantsController:管理功能

2. 视图模型层ViewModel Layer

位置: src/ViewModels/

职责:

  • 在控制器与视图之间传递数据
  • 表单数据绑定与验证

关键视图模型:

  • LoginViewModel:登录表单
  • RegisterViewModel:注册表单
  • AuthorizeViewModel:授权确认表单
  • DashboardViewModel:仪表板数据

3. 配置层Configuration Layer

位置: src/Configuration/

职责:

  • 集中管理应用程序配置
  • OpenIddict 服务配置
  • 身份验证策略配置

关键配置:

  • OpenIddictSetup.csOpenIddict 完整配置,包括授权流程、令牌生命周期、作用域等
  • FormValueRequiredAttribute.cs:自定义属性用于表单提交处理

4. 基础设施层Infrastructure Layer

外部依赖: Fengling.Platform.Infrastructure NuGet 包

提供的功能:

  • PlatformDbContextEntity Framework Core 数据库上下文
  • ApplicationUser:应用程序用户实体
  • ApplicationRole:应用程序角色实体
  • 仓储Repository模式实现
  • MediatR 中间件与行为Behaviors
  • 命令锁定行为Command Lock Behavior
  • 工作单元Unit of Work支持

数据流

用户认证流程

1. 用户访问 /account/login
   ↓
2. AccountController 返回登录视图Login.cshtml
   ↓
3. 用户提交表单 → AccountController.Login POST
   ↓
4. UserManager 验证用户名密码
   ↓
5. SignInManager 创建认证 Cookie
   ↓
6. 重定向到原始 URL 或 /dashboard

OAuth2 授权码流程

1. 客户端应用重定向到 /connect/authorize
   ↓
2. AuthorizationController.Authorize 检查用户登录状态
   ↓
3. 未登录 → 重定向到登录页面
   ↓
4. 已登录 → 检查授权记录
   ↓
5. 需要用户授权 → 返回授权确认视图Authorize.cshtml
   ↓
6. 用户确认 → AuthorizationController.Accept
   ↓
7. 创建授权记录 → 返回令牌

令牌颁发流程

1. 客户端 POST /connect/token
   ↓
2. TokenController.Exchange 处理请求
   ↓
3. 根据授权类型password/refresh_token/authorization_code处理
   ↓
4. 从 UserManager 获取用户信息
   ↓
5. 构建 Claims 身份(包括租户信息、角色)
   ↓
6. 设置 Claim Destinations
   ↓
7. SignIn 返回令牌

关键抽象

用户与租户抽象

ApplicationUser

  • 继承自 ASP.NET Core Identity 的 IdentityUser
  • 包含 TenantInfo 属性实现多租户支持

TenantInfo 值对象:

  • TenantId:租户标识符
  • TenantCode:租户代码
  • TenantName:租户名称

声明Claims抽象

标准声明:

  • sub:用户唯一标识
  • name:用户名
  • email:用户邮箱
  • role:用户角色

自定义声明:

  • tenant_id:租户 ID
  • tenant_code:租户代码
  • tenant_name:租户名称

授权Authorization抽象

OpenIddict 实体:

  • OpenIddictApplicationOAuth2 客户端应用
  • OpenIddictAuthorization:授权记录
  • OpenIddictScope:授权作用域
  • OpenIddictToken:访问令牌/刷新令牌

入口点

Web 应用程序入口

位置: src/Program.cs

启动流程:

  1. 配置 Serilog 日志
  2. 注册平台核心服务AddPlatformCore
  3. 配置 ASP.NET Core Identity
  4. 配置 Razor Pages 和 MVC
  5. 配置 Cookie 认证
  6. 配置 OpenIddict
  7. 配置 OpenTelemetry 分布式追踪
  8. 配置健康检查
  9. 注册仓储Repositories
  10. 注册 MediatR 和中间件行为
  11. 配置 Swagger开发环境
  12. 初始化数据库

HTTP 端点

认证端点:

  • GET/POST /account/login:用户登录
  • GET/POST /account/register:用户注册
  • POST /account/~/connect/logout:用户登出
  • GET/POST /connect/authorize:授权端点
  • POST /connect/token:令牌端点
  • GET /connect/userinfo:用户信息端点

管理端点:

  • GET /dashboard:用户仪表板
  • GET /dashboard/profile:用户资料
  • GET /dashboard/settings:设置页面
  • GET/POST /users:用户管理
  • GET/POST /roles:角色管理
  • GET/POST /tenants:租户管理

系统端点:

  • GET /health:健康检查
  • GET /swagger/index.htmlAPI 文档

错误处理

策略: 基于 ASP.NET Core 标准异常处理

模式:

  • 模型验证失败返回视图ModelState
  • 认证失败返回 401/403
  • OpenIddict 错误返回标准错误响应
  • 全局异常由中间件捕获并记录

跨领域关注点

日志记录

框架: Serilog

配置: 在 Program.cs 中配置,控制台输出

模板:

[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}

分布式追踪

框架: OpenTelemetry

组件:

  • AspNetCoreInstrumentation
  • HttpClientInstrumentation
  • OpenIddict.Server.AspNetCore 追踪源
  • OTLP Exporter

健康检查

端点: /health

检查项:

  • PostgreSQL 数据库连接NpgSql

安全配置

认证方案:

  • Cookie 认证(默认方案):用于 Web 界面登录
  • OpenIddict Server用于 OAuth2/OIDC

令牌配置:

  • 访问令牌生命周期24 小时
  • 使用引用令牌Reference Tokens
  • 支持刷新令牌

架构分析2026-02-28