
PandaAuth:自托管身份服务的轻量选择
为 .NET 团队准备的自托管 OIDC 身份服务:协议基于 OpenIddict,身份核心由一个 Server 和 PostgreSQL 组成。
为自家产品设计登录时,我们希望更直接地掌握身份数据与授权边界,也希望身份服务适配 .NET 技术栈。于是我们选择自建 PandaAuth,并按 MIT 协议开源。PandaAuth 基于 OpenIddict 7.7、.NET 10 和 PostgreSQL。当前 Community Preview 0.2.0-preview.1 面向早期评估,不承诺 SLA,尚未发布稳定版 1.0。
架构分层:协议框架与身份业务
PandaAuth 的身份提供方(IDP)核心由一个 Server 和 PostgreSQL 组成。OpenIddict 承担 OIDC 与 OAuth 2.0 协议处理,包括授权码 + PKCE、客户端凭证、刷新令牌,以及 userinfo、introspection、revocation、logout、discovery 和 JWKS。把标准协议交由成熟框架处理,可以让自研部分集中在身份业务和工程边界上。
PandaAuth 自己负责用户与角色模型、EF Core 持久化和数据库迁移,以及登录、MFA、限流、会话治理与审计等应用能力。客户端可读取 discovery 元数据,并使用标准 OIDC 客户端库集成;协议接入不依赖专有 SDK。
轻量指核心部署面,不代表整套产品只有一个进程
这里的「一个 Server」指 IDP 核心。管理台 panda-auth-admin、账户中心 panda-auth-me 与 .NET SDK panda-auth-sdk 是配套组件,源码均已公开。官方 Quickstart Preview 还会在本机启动 PostgreSQL 和 Caddy,供开发者体验完整的授权码 + PKCE 登录流程;它用于本地评估,不是生产部署方案。
安全机制要连同运行边界一起理解
密码使用 Argon2id,并采用 OWASP 基线参数。对不存在的账号与密码错误,登录路径执行计算量相近的校验,以降低响应时间差异带来的账号枚举风险。连续五次登录失败会触发五分钟临时锁定。
登录限流同时按 IP 与账号维度执行,覆盖分散扫描和针对单个账号的尝试。限流状态保存在进程内,因此重启会重置状态;多实例部署也需要考虑各实例之间的限流状态边界。
密码重置、冻结、角色调整、MFA 重置等安全事件会更新账户安全状态,并撤销服务器端可识别的相关令牌。PandaAuth 启用了在线令牌条目校验(token-entry validation),经由 IDP 在线校验令牌的请求可以识别吊销状态。若下游服务只离线验证 JWT 签名,它没有实时查询吊销状态的机会,已签发的 Access Token 可能继续被接受到过期。令牌缓存与校验策略由各资源服务负责,集成时应按风险决定。
签名密钥在服务启动时检查轮换周期并按需生成新密钥;加密密钥目前在缺失时创建,不做自动轮换。多实例部署需要设计好密钥持久化、JWKS 一致性与滚动重启流程。这些约束属于部署设计的一部分。
公开集成面与管理边界
应用登录与授权走标准 OIDC / OAuth 2.0 接口,端点以 discovery 元数据为准。用户和客户端通过管理员控制台管理;Management API 当前不作为公开集成能力提供,集成方不应依赖未公开端点。公开文档说明,管理操作和管理员登录会写入审计记录,日志不记录明文密码或验证码。
适合什么团队评估
PandaAuth 面向希望自托管身份服务、使用 .NET 技术栈并需要审阅或修改服务端实现的团队。我们的取舍更适合这类需求:团队使用 .NET、希望审阅和修改源码,并希望保持紧凑的 IDP 核心部署面。各产品的能力、运维工作和成熟度不同,应该按真实需求逐项比较。PandaAuth 仍处于 Community Preview 阶段,不以替代 Keycloak、Authentik、Logto 或 Casdoor 为目标。
自托管也意味着团队需要负责生产环境的部署、升级、备份、密钥保护、可用性和安全响应。若你正在评估身份系统,可以先查看 PandaAuth 的产品说明与接入文档,并确认 Preview 阶段和自运维责任符合团队要求。