# 代码库问题与关注点
**分析日期:** 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