diff --git a/.planning/codebase/ARCHITECTURE.md b/.planning/codebase/ARCHITECTURE.md
new file mode 100644
index 0000000..fd0591c
--- /dev/null
+++ b/.planning/codebase/ARCHITECTURE.md
@@ -0,0 +1,257 @@
+# 架构分析
+
+**分析日期:** 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`:用户登录、注册、登出
+- `AuthorizationController`:OAuth2 授权端点
+- `TokenController`:令牌颁发端点
+- `DashboardController`:用户仪表板
+- `UsersController`、`RolesController`、`TenantsController`:管理功能
+
+### 2. 视图模型层(ViewModel Layer)
+
+**位置:** `src/ViewModels/`
+
+**职责:**
+- 在控制器与视图之间传递数据
+- 表单数据绑定与验证
+
+**关键视图模型:**
+- `LoginViewModel`:登录表单
+- `RegisterViewModel`:注册表单
+- `AuthorizeViewModel`:授权确认表单
+- `DashboardViewModel`:仪表板数据
+
+### 3. 配置层(Configuration Layer)
+
+**位置:** `src/Configuration/`
+
+**职责:**
+- 集中管理应用程序配置
+- OpenIddict 服务配置
+- 身份验证策略配置
+
+**关键配置:**
+- `OpenIddictSetup.cs`:OpenIddict 完整配置,包括授权流程、令牌生命周期、作用域等
+- `FormValueRequiredAttribute.cs`:自定义属性用于表单提交处理
+
+### 4. 基础设施层(Infrastructure Layer)
+
+**外部依赖:** `Fengling.Platform.Infrastructure` NuGet 包
+
+**提供的功能:**
+- `PlatformDbContext`:Entity 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 实体:**
+- `OpenIddictApplication`:OAuth2 客户端应用
+- `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.html`:API 文档
+
+## 错误处理
+
+**策略:** 基于 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*
diff --git a/.planning/codebase/CONCERNS.md b/.planning/codebase/CONCERNS.md
new file mode 100644
index 0000000..e3f78b5
--- /dev/null
+++ b/.planning/codebase/CONCERNS.md
@@ -0,0 +1,537 @@
+# 代码库问题与关注点
+
+**分析日期:** 2026-02-28
+
+---
+
+## 一、严重安全问题
+
+### 1.1 配置文件泄露敏感凭证
+
+**问题描述:** `appsettings.json` 包含明文数据库密码和 JWT 密钥。
+
+**文件位置:** `src/appsettings.json`
+
+**泄露内容:**
+```json
+"ConnectionStrings": {
+ "DefaultConnection": "Host=81.68.223.70;Port=15432;Database=fengling_auth;Username=movingsam;Password=sl52788542"
+},
+"Jwt": {
+ "Secret": "FenglingAuthSecretKey2024!ChangeThisInProduction!"
+}
+```
+
+**影响:**
+- 数据库凭据完全暴露,包括用户名、密码、主机地址和端口
+- JWT 密钥硬编码在配置文件中,攻击者可用其伪造令牌
+- 若此文件被提交到版本控制系统,将造成严重安全漏洞
+
+**修复建议:**
+- 立即将敏感信息迁移至环境变量或密钥保管库
+- 使用 ASP.NET Core 的密钥管理功能(`dotnet user-secrets`)
+- 在生产环境中使用 Azure Key Vault、AWS Secrets Manager 等
+- 创建 `appsettings.Production.json` 并通过环境变量加载配置
+
+---
+
+### 1.2 Cookie 安全策略配置不当
+
+**问题描述:** 认证 Cookie 配置为非安全策略。
+
+**文件位置:** `src/Program.cs` 第 43-44 行
+
+```csharp
+options.Cookie.SecurePolicy = CookieSecurePolicy.None;
+options.Cookie.SameSite = SameSiteMode.Lax;
+```
+
+**影响:**
+- `CookieSecurePolicy.None` 允许 Cookie 通过非 HTTPS 连接传输
+- `SameSiteMode.Lax` 无法完全防止 CSRF 攻击
+- 用户凭证可能在网络传输中被截获
+
+**修复建议:**
+```csharp
+options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
+options.Cookie.SameSite = SameSiteMode.Strict;
+options.Cookie.HttpOnly = true;
+```
+
+---
+
+### 1.3 访问令牌未加密
+
+**问题描述:** OpenIddict 配置禁用了访问令牌加密。
+
+**文件位置:** `src/Configuration/OpenIddictSetup.cs` 第 64 行
+
+```csharp
+options.DisableAccessTokenEncryption();
+```
+
+**影响:**
+- 访问令牌以明文形式传输,任何中间人都能读取令牌内容
+- 攻击者可窃取令牌并冒充合法用户
+
+**修复建议:**
+- 生产环境必须启用令牌加密
+- 使用有效的加密证书而非开发证书
+
+---
+
+### 1.4 CORS 允许所有来源
+
+**问题描述:** CORS 配置允许任意来源的跨域请求。
+
+**文件位置:** `src/Program.cs` 第 102-109 行
+
+```csharp
+app.UseCors(x =>
+{
+ x.SetIsOriginAllowed(origin => true)
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials()
+ .Build();
+});
+```
+
+**影响:**
+- 任何网站都能向此 API 发起跨域请求
+- 极大增加 CSRF 和数据泄露风险
+
+**修复建议:**
+- 明确配置允许的来源列表
+- 使用环境变量控制允许的域名
+
+---
+
+### 1.5 开发证书用于生产环境
+
+**问题描述:** OpenIddict 使用开发环境证书进行签名和加密。
+
+**文件位置:** `src/Configuration/OpenIddictSetup.cs` 第 61-62 行
+
+```csharp
+options.AddDevelopmentEncryptionCertificate()
+ .AddDevelopmentSigningCertificate();
+```
+
+**影响:**
+- 开发证书的私钥是公开的,攻击者可伪造令牌
+- 严重威胁生产环境安全
+
+**修复建议:**
+- 生产环境使用正式的 SSL/TLS 证书
+- 使用 Azure Key Vault 或类似服务存储证书
+
+---
+
+## 二、技术债务
+
+### 2.1 完全没有单元测试
+
+**问题描述:** 代码库中不存在任何测试文件。
+
+**文件位置:** 整个项目
+
+**影响:**
+- 无法确保代码质量
+- 重构风险极高,容易引入 bug
+- 难以验证边界条件和错误处理
+
+**修复建议:**
+- 引入 xUnit 或 NUnit 测试框架
+- 为所有 Controller 编写单元测试
+- 为关键业务逻辑(Token 颁发、用户管理等)编写集成测试
+- 目标覆盖率应达到 70% 以上
+
+---
+
+### 2.2 使用 .NET 10.0
+
+**问题描述:** 项目目标框架为 .NET 10.0。
+
+**文件位置:** `src/Fengling.AuthService.csproj` 第 3 行
+
+```xml
+net10.0
+```
+
+**影响:**
+- .NET 10.0 目前可能为预览版或早期版本
+- 稳定性存在风险,缺乏长期支持
+- 依赖包兼容性问题
+
+**修复建议:**
+- 生产环境应使用 LTS(长期支持)版本(如 .NET 8.0)
+- 密切关注 .NET 10.0 的正式发布和稳定性评估
+
+---
+
+### 2.3 审计日志逻辑重复
+
+**问题描述:** 审计日志创建逻辑在多个控制器中重复实现。
+
+**受影响文件:**
+- `src/Controllers/UsersController.cs` - `CreateAuditLog` 方法
+- `src/Controllers/RolesController.cs` - `CreateAuditLog` 方法
+- `src/Controllers/TenantsController.cs` - `CreateAuditLog` 方法
+
+**影响:**
+- 代码重复,维护困难
+- 行为不一致风险
+- 违反 DRY 原则
+
+**修复建议:**
+- 提取为独立的审计日志服务
+- 使用 MediatR 管道行为统一处理
+- 创建审计日志特性的 AOP 方案
+
+---
+
+### 2.4 不一致的依赖注入风格
+
+**问题描述:** 控制器同时使用两种不同的依赖注入方式。
+
+**文件位置:**
+- 构造函数注入(传统方式):`src/Controllers/RolesController.cs`
+- Primary Constructor 注入(记录式):`src/Controllers/UsersController.cs`
+
+**示例对比:**
+
+传统方式(RolesController):
+```csharp
+public class RolesController : ControllerBase
+{
+ private readonly PlatformDbContext _context;
+
+ public RolesController(PlatformDbContext context)
+ {
+ _context = context;
+ }
+}
+```
+
+Primary Constructor 方式(UsersController):
+```csharp
+public class UsersController(
+ UserManager userManager,
+ RoleManager roleManager,
+ ILogger logger,
+ PlatformDbContext platformDbContext)
+ : ControllerBase
+```
+
+**影响:**
+- 代码风格不统一
+- 增加新人学习成本
+
+**修复建议:**
+- 统一采用 Primary Constructor 方式(ASP.NET Core 8.0+ 推荐)
+- 或统一使用传统构造函数注入方式
+
+---
+
+## 三、已知缺陷
+
+### 3.1 未实现的接口方法
+
+**问题描述:** 某些接口返回硬编码或空值。
+
+**文件位置:** `src/Controllers/TenantsController.cs` 第 171-192 行
+
+```csharp
+[HttpGet("{tenantId}/settings")]
+public async Task> GetTenantSettings(long tenantId)
+{
+ // ...
+ var settings = new TenantSettings
+ {
+ AllowRegistration = false,
+ AllowedEmailDomains = "",
+ DefaultRoleId = null,
+ PasswordPolicy = new List { "requireNumber", "requireLowercase" },
+ MinPasswordLength = 8,
+ SessionTimeout = 120,
+ };
+
+ return Ok(settings);
+}
+```
+
+**影响:**
+- 租户设置无法持久化
+- 配置变更不生效
+
+**修复建议:**
+- 创建 TenantSettings 实体
+- 实现 CRUD 操作
+- 与租户配置表关联
+
+---
+
+### 3.2 Profile 接口重定向
+
+**问题描述:** Profile 和 Settings 路由指向未实现的方法。
+
+**文件位置:** `src/Controllers/AccountController.cs` 第 111-117 行
+
+```csharp
+[HttpGet("profile")]
+[HttpGet("settings")]
+[HttpGet("~/connect/logout")]
+public IActionResult NotImplemented()
+{
+ return RedirectToAction("Index", "Dashboard");
+}
+```
+
+**影响:**
+- 用户访问个人资料页面时被重定向
+- 功能缺失,用户体验差
+
+**修复建议:**
+- 实现完整的个人资料页面
+- 允许用户查看和修改基本信息
+
+---
+
+## 四、性能问题
+
+### 4.1 N+1 查询问题
+
+**问题描述:** 列表接口在循环中执行数据库查询。
+
+**文件位置:** `src/Controllers/RolesController.cs` 第 63-78 行
+
+```csharp
+foreach (var role in roles)
+{
+ var users = await _userManager.GetUsersInRoleAsync(role.Name!);
+ result.Add(new
+ {
+ // ...
+ userCount = users.Count,
+ // ...
+ });
+}
+```
+
+**影响:**
+- 假设有 N 个角色,将执行 1+N 次数据库查询
+- 角色数量增加时,性能呈线性下降
+- 数据库负载显著增加
+
+**修复建议:**
+- 使用单一查询获取所有角色及其用户数
+- 通过 JOIN 或子查询聚合计数
+
+---
+
+### 4.2 内存分页问题
+
+**问题描述:** OAuth 客户端列表先将所有数据加载到内存,再进行分页。
+
+**文件位置:** `src/Controllers/OAuthClientsController.cs` 第 31-86 行
+
+```csharp
+var applications = _applicationManager.ListAsync();
+var clientList = new List