Files
lijiaoqiao/docs/sso_saml_technical_research_v1_2026-04-02.md

1107 lines
30 KiB
Markdown
Raw Permalink Normal View History

# SSO/SAML集成技术调研报告
> 版本v1.1
> 日期2026-04-02
> 目的为LLM Gateway项目提供SSO/SAML技术选型参考
> 状态已修复根据2026-04-02评审意见
---
## 1. 执行摘要
### 1.1 调研范围
本报告针对以下SSO/SAML方案进行技术调研和对比分析
- Keycloak开源
- Auth0商业现属Okta
- Okta商业
- Casdoor开源中国团队
- Ory开源
- Azure AD / Microsoft Entra ID商业微软
### 1.2 关键结论
| 优先级 | 场景 | 推荐方案 | 理由 |
|--------|------|----------|------|
| **P0** | 快速上线 + 成本敏感 | **Casdoor** | 轻量级部署、中文文档、中国合规 |
| **P1** | 企业级功能 + 长期演进 | **Keycloak** | 功能最全面、社区活跃、定制能力强 |
| **P2** | 国际化企业客户 | **Okta/Auth0** | 品牌信任、全球化合规 |
| **后续** | Microsoft 365生态客户 | **Azure AD/Entra ID** | 企业市场领导者,世纪互联运营合规版本 |
### 1.3 行动建议
**近期1-2个月**:采用 Casdoor 作为MVP方案满足快速上线需求
**中期3-6个月**:评估 Keycloak 迁移路径,支持更复杂的企业需求
**长期6个月+**:根据客户群体,决定是否迁移到 Okta/Auth0 或 Azure AD/Entra ID
---
## 2. 供应商详细对比
### 2.1 Keycloak
#### 2.1.1 基本信息
| 属性 | 值 |
|------|-----|
| 类型 | 开源 (Apache 2.0) |
| 官网 | https://www.keycloak.org |
| 最新版本 | 26.x (2025) |
| GitHub Stars | ~28k |
| 主要语言 | Java |
#### 2.1.2 功能特性
**协议支持**
- SAML 2.0 (完整实现)
- OpenID Connect / OAuth 2.0
- LDAP / Active Directory
- Social Login (Google, GitHub, etc.)
- 离线令牌
**企业级功能**
- 多租户支持 (Realm级别隔离)
- 细粒度RBAC + ABAC
- 身份代理 (Identity Brokering)
- 用户联盟
- 审计日志
- 密码策略
- MFA (TOTP, WebAuthn, SMS)
- 客户端_credentials_flow (机器对机器)
#### 2.1.3 Go集成方案
**推荐库**
- `github.com/keycloak/keycloak-go` (社区维护)
- `github.com/coreos/go-oidc` (通用OIDC库)
**集成复杂度**:中等
- 需要部署Keycloak服务器
- 提供标准OIDC/SAML接口
- 官方提供 Helm Chart / Operator
**优势**
- 功能最全面的开源方案
- 活跃的社区和丰富的文档
- Red Hat支持 (JBoss/WildFly生态)
- 大量生产环境验证
**劣势**
- 资源占用较高 (建议4C8G+)
- Java技术栈学习曲线
- 默认配置安全性需加强
- 中国区无原生CDN加速
#### 2.1.4 成本分析
| 成本项 | 费用 |
|--------|------|
| 软件本身 | 免费 |
| 自托管服务器 | ¥500-2000/月 (4C8G云主机) |
| 运维人力 | 0.5-1 FTE |
| 商业支持 | Red Hat SSO (约 $40k/年) |
---
### 2.2 Auth0
#### 2.2.1 基本信息
| 属性 | 值 |
|------|-----|
| 类型 | 商业SaaS |
| 官网 | https://auth0.com |
| 母公司 | Okta (2021年收购) |
| 估值 | $340亿+ (Okta) |
#### 2.2.2 功能特性
**协议支持**
- SAML 2.0 / SAML Proxy
- OpenID Connect / OAuth 2.0
- WS-Federation
- 所有主流Social Login
**企业级功能**
- universal login (单页登录)
- 异常检测 (Anomaly Detection)
- 机器对机器认证
- 无密码认证 (Passwordless)
- 实时日志流
- 99.99% SLA
#### 2.2.3 Go集成方案
**推荐库**
- `github.com/auth0/go-auth0` (官方SDK)
- `goth` (社区Social Login库)
**集成复杂度**:低
- 提供SDK集成简单
- 丰富的API和Webhook
- 详细的开发者文档
**优势**
- 零运维负担
- 业界最佳实践
- 快速集成 (通常1-2周)
- 信用卡PCI合规
**劣势**
- **数据必须传到境外服务器**
- 成本较高 (按MAU计费)
- 中国区访问慢/不稳定
- vendor lock-in风险
#### 2.2.4 成本分析
| 成本项 | 费用 |
|--------|------|
| 免费额度 | 7,000 MAU |
| Growth Plan | $165/月起 或 $0.020/MAU |
| Enterprise | 需询价 ($50k+/年) |
| **实际成本** | **¥5-50万/年** |
---
### 2.3 Okta
#### 2.3.1 基本信息
| 属性 | 值 |
|------|-----|
| 类型 | 商业SaaS |
| 官网 | https://www.okta.com |
| 上市 | NASDAQ: OKTA |
| 市值 | ~$340亿 |
#### 2.3.2 功能特性
**协议支持**
- SAML 2.0 (核心功能)
- OpenID Connect / OAuth 2.0
- SCIM 2.0 (用户配置)
- 所有主流企业应用集成
**企业级功能**
- Application Network (预集成7k+应用)
- Lifecycle Management
- API Access Management
- Advanced Server Access
- Privileged Access
- 99.99% SLA
#### 2.3.3 Go集成方案
**推荐库**
- `github.com/okta/okta-sdk-golang` (官方SDK)
- `github.com/okta/okta-jwt-verifier-go`
**集成复杂度**:低
**优势**
- 企业市场领导者
- 最广泛的集成生态
- 成熟的治理功能
- 强大的合规认证 (SOC2, ISO27001, FedRAMP)
**劣势**
- **数据必须传到境外服务器**
- 成本最高
- 中国区访问问题严重
- vendor lock-in风险
#### 2.3.4 成本分析
| 成本项 | 费用 |
|--------|------|
| IAM | $3-6/人/月 |
| SSO | $4-8/人/月 |
| Lifecycle | $3/人/月 |
| **Enterprise套餐** | **$100k+/年** |
---
### 2.4 Casdoor
#### 2.4.1 基本信息
| 属性 | 值 |
|------|-----|
| 类型 | 开源 (Apache 2.0) |
| 官网 | https://casdoor.org |
| GitHub Stars | ~9k |
| 主要语言 | Go |
| 维护团队 | 中国团队 |
#### 2.4.2 功能特性
**协议支持**
- SAML 2.0 (完整实现)
- OpenID Connect / OAuth 2.0
- LDAP (部分)
- 社交登录 (微信、钉钉等中国平台)
- CAS 1.0/2.0
**企业级功能**
- 多租户支持
- 基于组织的访问控制 (Org-based RBAC)
- WebAuthn / FIDO2
- 微信/钉钉/飞书集成 (中国特色)
- 轻量级设计 (~50MB内存)
#### 2.4.3 Go集成方案
**推荐库**
- `github.com/casdoor/casdoor-go-sdk` (官方SDK)
- 直接调用API
**集成复杂度**:低
- 纯Go实现与项目技术栈一致
- 提供 Helm Chart / Docker Compose
- 中文文档完善
**优势**
- **Go语言原生与Gateway技术栈一致**
- **内置中国社交登录(微信、钉钉)**
- **轻量级,资源占用低**
- **中文社区,文档完善**
- **可以完全自托管,数据不出境**
**劣势**
- 社区规模较小
- 国际化程度较低
- 生产验证案例少于Keycloak
- 部分功能仍在完善
#### 2.4.4 成本分析
| 成本项 | 费用 |
|--------|------|
| 软件本身 | 免费 |
| 自托管服务器 | ¥100-500/月 (2C4G即可) |
| 运维人力 | 0.25-0.5 FTE |
| 商业支持 | 暂无官方商业支持 |
---
### 2.5 Ory
#### 2.5.1 基本信息
| 属性 | 值 |
|------|-----|
| 类型 | 开源 (Apache 2.0) |
| 官网 | https://www.ory.sh |
| GitHub Stars | ~15k (Keto) |
| 主要语言 | Go |
#### 2.5.2 功能特性
**组件**
- **Ory Kratos**: 身份与用户管理
- **Ory OAuth2/OIDC**: OAuth2/OIDC实现
- **Ory Keto**: 权限管理 (Zanzibar)
- **Ory Hydra**: OAuth2授权服务器
- **Ory Oathkeeper**: 零信任代理
**协议支持**
- OpenID Connect / OAuth 2.0
- OAuth 2.0 (Hydra)
- WebAuthn / FIDO2 (Kratos)
- **不支持SAML** (重要!)
**企业级功能**
- 微服务友好
- 云原生架构 (Kubernetes Native)
- 可扩展的权限模型
- 低延迟 (Go实现)
#### 2.5.3 Go集成方案
**推荐库**
- `github.com/ory/kratos-client-go`
- `github.com/ory/hydra-client-go`
**集成复杂度**:中
- 需要组合多个组件
- 无SAML支持
- 文档质量参差不齐
**优势**
- **Go语言原生性能优异**
- 云原生友好
- 现代架构设计
- 权限模型强大
**劣势**
- **不支持SAML** (如有SAML需求则排除)
- 组件较多,集成复杂
- 社区较小
- 文档不够完善
#### 2.5.4 成本分析
| 成本项 | 费用 |
|--------|------|
| 软件本身 | 免费 (开源) |
| Ory Cloud | $25/月起 (托管服务) |
| 自托管服务器 | ¥500-1500/月 |
| 商业支持 | Ory Enterprise (询价) |
---
### 2.6 Azure AD / Microsoft Entra ID
#### 2.6.1 基本信息
| 属性 | 值 |
|------|-----|
| 类型 | 商业SaaS |
| 官网 | https://www.microsoft.com/en-us/security/business/microsoft-entra-id |
| 原名 | Azure Active Directory (Azure AD) |
| 最新名称 | Microsoft Entra ID |
| 市值 | 微软市值 ~$2.8万亿 |
#### 2.6.2 中国运营版本
| 版本 | 运营方 | 合规优势 |
|------|--------|----------|
| Global版 | 微软(境外) | 全球覆盖,中国大陆访问受限 |
| 世纪互联版 | 世纪互联(境内) | **数据存储在中国大陆**,满足《网络安全法》要求 |
> **重要**:中国区企业客户可申请**世纪互联运营的Entra ID版本**数据存储在境内数据中心合规风险显著低于其他境外SaaS方案。
#### 2.6.3 功能特性
**协议支持**
- SAML 2.0 (完整实现)
- OpenID Connect / OAuth 2.0
- WS-Federation
- SCIM 2.0 (用户配置)
- 所有主流企业应用集成
**企业级功能**
- Microsoft 365 / Teams / SharePoint / Dynamics 365 原生集成
- Application Network (预集成900+应用)
- Conditional Access (条件访问)
- Identity Protection (身份保护)
- Privileged Identity Management (特权身份管理)
- API Access Management
- 99.99% SLA
#### 2.6.4 Go集成方案
**推荐库**
- `github.com/microsoftgraph/msgraph-sdk-go` (官方SDK)
- `github.com/AzureAD/microsoft-authentication-library-for-go` (MSAL Go)
**集成复杂度**:中
- 标准OIDC/SAML接口集成友好
- Microsoft Graph API功能丰富
- 文档完善,但中国版可能有差异
**优势**
- **企业市场领导者**,品牌信任度高
- **Microsoft 365生态原生集成**
- **世纪互联版本数据境内存储**,合规风险低
- 企业客户已有订阅的情况多
- 合规认证最全SOC2, ISO27001, FedRAMP, 中国等保)
**劣势**
- 境外Global版数据出境风险高
- 成本较高
- 部分功能仅限Global版
- 技术栈绑定微软生态
#### 2.6.5 成本分析
| 成本项 | 费用 |
|--------|------|
| Free Tier | 免费(基础功能) |
| P1 (每用户/月) | $6 |
| P2 (每用户/月) | $9 |
| Enterprise套餐 | $100k+/年 |
| **实际成本** | **¥300-600/人/年(基础版)** |
---
## 3. 综合对比表
### 3.1 功能维度
| 特性 | Keycloak | Auth0 | Okta | Casdoor | Ory | Azure AD |
|------|----------|-------|------|---------|-----|----------|
| SAML 2.0 | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| OIDC/OAuth2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 多租户 | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ |
| MFA | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ |
| 中国社交登录 | ⚠️ | ❌ | ❌ | ✅ | ❌ | ❌ |
| 用户 federation | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ✅ |
| 轻量级 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Go SDK | ⚠️ | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| 社区活跃度 | 高 | 高 | 高 | 中 | 中 | 高 |
| Microsoft 365集成 | ⚠️ | ❌ | ❌ | ❌ | ❌ | ✅ |
| 审计报表 | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ✅ |
### 3.2 成本维度
| 成本项 | Keycloak | Auth0 | Okta | Casdoor | Ory | Azure AD |
|--------|----------|-------|------|---------|-----|----------|
| 软件成本 | $0 | $0-$50k+/年 | $50k+/年 | $0 | $0 | ¥300-600/人/年 |
| 基础设施/月 | ¥500-2000 | $0 | $0 | ¥100-500 | ¥500-1500 | $0 |
| 集成复杂度 | 中 | 低 | 低 | 低 | 中 | 中 |
| 维护成本 | 中 | 低 | 低 | 低 | 中 | 低 |
### 3.3 合规维度
| 合规要求 | Keycloak | Auth0 | Okta | Casdoor | Ory | Azure AD (Global) | Azure AD (世纪互联) |
|----------|----------|-------|------|---------|-----|---------------------|---------------------|
| 中国数据不出境 | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | **✅** |
| GDPR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| SOC2 | ⚠️ | ✅ | ✅ | ❌ | ⚠️ | ✅ | ✅ |
| ISO27001 | ⚠️ | ✅ | ✅ | ❌ | ⚠️ | ✅ | ✅ |
| 中国等保 | ⚠️ | ❌ | ❌ | ⚠️ | ⚠️ | ⚠️ | **待定** |
| FedRAMP | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ |
---
## 4. 中国区合规分析
### 4.1 数据本地化要求
根据《网络安全法》《数据安全法》《个人信息保护法》:
- **重要数据必须存储在境内**
- 个人信息出境需安全评估
- 金融、医疗等行业有额外要求
### 4.2 等保合规分析
#### 4.2.1 等保认证状态对比
| 方案 | 等保认证状态 | 认证级别 | 说明 |
|------|-------------|---------|------|
| Keycloak (自托管) | **可满足等保** | 需自行认证 | 本身不具备认证,需通过部署配置满足要求 |
| Casdoor (自托管) | **待验证** | 无官方认证 | 需通过部署配置和额外安全加固满足要求 |
| Ory (自托管) | **待验证** | 无官方认证 | 需通过部署配置满足要求 |
| Azure AD (世纪互联) | **待定** | 暂无等保认证 | 微软未公开等保认证情况 |
| Auth0 | **不可行** | 无 | 境外服务,数据出境 |
| Okta | **不可行** | 无 | 境外服务,数据出境 |
#### 4.2.2 等保合规验证清单
**自托管方案等保满足路径**
1. **网络安全等级保护等保2.0)基本要求**
- 身份鉴别:实现强密码策略、多因素认证 ✅ (Keycloak/Casdoor均支持)
- 访问控制细粒度RBAC/ABAC ✅ (Keycloak最强Casdoor支持Org-based RBAC)
- 安全审计:日志记录、留存、查询 ✅ (均支持,但报表能力有差异)
- 入侵防范Web应用防火墙、日志监控 ⚠️ 需额外配置
- 数据保密性:传输加密、存储加密 ✅ (TLS+数据库加密)
2. **各方案合规满足度评估**
| 等保要求项 | Keycloak | Casdoor | Ory |
|-----------|----------|---------|-----|
| 身份鉴别 (8.1.3) | ✅ 完全满足 | ✅ 满足 | ⚠️ 部分满足 |
| 访问控制 (8.1.4) | ✅ 完全满足 | ✅ 满足 | ⚠️ 部分满足 |
| 安全审计 (8.1.5) | ✅ 完整审计日志 | ⚠️ 基础日志 | ⚠️ 基础日志 |
| 审计报表导出 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
| 数据保密性 (8.1.9) | ✅ 满足 | ✅ 满足 | ✅ 满足 |
| **等保合规风险** | **低** | **中** | **中** |
#### 4.2.3 行业特定合规建议
| 行业 | 额外要求 | 合规建议 |
|------|---------|----------|
| 政府/国企 | 等保三级、系统国产化 | **Keycloak**(功能最全面,可定制) |
| 金融 | 等保三级、PCI DSS、数据加密 | **Keycloak** + 额外安全加固 |
| 医疗 | 等保二级、HIPAA合规 | **Keycloak****Casdoor** |
| 教育 | 等保二级 | **Casdoor**(轻量、微信集成) |
> **重要结论**Casdoor和Ory均未取得等保认证在政府/金融/医疗行业作为IdP使用时可能存在准入障碍。建议在高合规要求行业中使用**Keycloak自托管**方案。
### 4.3 合规结论
| 方案 | 数据出境风险 | 等保合规 | 建议 |
|------|-------------|----------|------|
| Keycloak (自托管) | **无风险** | **可满足(需自行认证)** | 推荐 ✅ |
| Auth0 | **高风险** | 不可行 | 不推荐 ❌ |
| Okta | **高风险** | 不可行 | 不推荐 ❌ |
| Casdoor (自托管) | **无风险** | **待验证(存在风险)** | 推荐(谨慎)⚠️ |
| Ory (自托管) | **无风险** | **待验证(存在风险)** | 慎选 ⚠️ |
| Azure AD (世纪互联) | **低风险** | **待定** | 可考虑Microsoft生态 |
**关键结论**
1. 如需满足中国合规要求必须选择自托管方案Keycloak/Casdoor/Ory或世纪互联版Azure AD
2. 高合规要求行业(政府/金融/医疗)建议使用**Keycloak**Casdoor/Ory可能存在准入障碍
3. Microsoft 365生态客户可考虑**Azure AD世纪互联版**,但需确认等保认证状态
### 4.4 审计报表能力评估
审计报表是企业版首批必含能力之一,以下是各方案的审计能力对比:
#### 4.4.1 审计能力对比
| 审计能力 | Keycloak | Auth0 | Okta | Casdoor | Ory | Azure AD |
|---------|----------|-------|------|---------|-----|----------|
| 登录日志 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 操作审计日志 | ✅ | ✅ | ✅ | ⚠️ 基础 | ⚠️ 基础 | ✅ |
| 自定义报表 | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
| 合规报告模板 | ✅ (SOX等) | ✅ | ✅ | ❌ | ❌ | ✅ |
| 日志导出格式 | JSON/SYSLOG | JSON | JSON | JSON | JSON | JSON |
| 日志留存周期 | 可配置 | 可配置 | 可配置 | 依赖DB | 依赖DB | 可配置 |
| 实时日志流 | ⚠️ | ✅ | ✅ | ❌ | ⚠️ | ✅ |
| 用户行为分析 | ⚠️ | ✅ | ✅ | ❌ | ❌ | ✅ |
| 异常检测 | ⚠️ | ✅ | ✅ | ❌ | ❌ | ✅ |
#### 4.4.2 审计报表能力分析
**Keycloak**
- 完整的审计事件日志(登录、登出、操作)
- 支持导出为JSON格式
- 可对接外部SIEM系统ELK、Splunk
- 自定义报表需借助第三方工具
- 提供事件监听器接口,可扩展
**Auth0/Okta**
- 最完善的审计报表能力
- 内置异常检测和实时告警
- 丰富的合规报告模板SOX、HIPAA、GDPR
- 99.99% SLA保障
**Casdoor**
- 基础审计日志功能
- 支持登录/登出事件记录
- **不支持自定义报表**
- **不支持合规报告模板**
- 日志依赖数据库存储,需自行实现导出
**Ory**
- 基础审计能力
- 通过Ory Keto可追踪权限变更
- **不支持自定义报表**
- 微服务架构,日志分散
**Azure AD**
- 完整的审计日志
- Azure Monitor集成
- 合规报告模板丰富
- Microsoft Sentinel可选
#### 4.4.3 审计报表能力结论
| 场景 | 推荐方案 | 说明 |
|------|---------|------|
| 基础审计需求 | Casdoor | MVP阶段可用需自行扩展报表 |
| 企业级审计 | Keycloak + SIEM | 可对接外部系统实现完整审计 |
| 高合规要求 | Okta/Auth0/Azure AD | 内置完整审计和合规报表 |
---
## 5. 技术选型建议
### 5.1 场景分析
#### 场景A快速上线 + 成本敏感 + 中国市场
**推荐Casdoor**
理由:
1. Go语言原生集成成本最低
2. 内置微信/钉钉/飞书登录,中国市场刚需
3. 轻量级2C4G即可运行
4. 部署简单有Docker Compose
5. 数据完全自托管,满足合规
风险:
- 社区较小,生产案例有限
- 部分功能如SAML IdP稳定性待验证
#### 场景B企业级需求 + 多客户 + 长期演进
**推荐Keycloak**
理由:
1. 功能最全面,生产验证最充分
2. 社区活跃,问题解决快
3. 支持SAML和OIDC兼容性最好
4. 多租户能力强
5. Red Hat商业支持可选
风险:
- 资源消耗较高
- Java技术栈与Go项目风格差异
#### 场景C国际化企业客户为主
**推荐Okta/Auth0**
理由:
1. 品牌认可度高
2. 预集成7k+应用
3. 合规认证最全
4. 零运维
风险:
- 数据出境问题
- 成本高昂
- vendor lock-in
### 5.2 推荐架构
```
┌─────────────────────────────────────┐
│ LLM Gateway │
│ ┌─────────────────────────────┐ │
│ │ Token Auth Middleware │ │
│ └──────────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────┐ │
│ │ SSO/SAML Integration │ │
│ │ (Go OIDC/SAML Client Lib) │ │
│ └──────────────┬──────────────┘ │
└─────────────────┼──────────────────┘
┌─────────────────────────────────────┐
│ 身份提供商 (IdP) │
│ │
│ MVP阶段: Casdoor (自托管) │
│ 演进阶段: Keycloak (可选) │
│ 企业客户: Okta/Auth0 (可选) │
│ Microsoft生态: Azure AD/Entra ID │
└─────────────────────────────────────┘
```
---
## 6. 集成方案设计
### 6.1 Casdoor集成方案
#### 6.1.1 部署架构
```yaml
# docker-compose.yml (Casdoor)
version: '3.8'
services:
casdoor:
image: casbin/casdoor:latest
ports:
- "8000:8000"
environment:
RUNNING_IN_DOCKER: "true"
volumes:
- ./conf:/conf
- ./data:/data
networks:
- casdoor-network
# 可选MySQL/PostgreSQL 存储
db:
image: postgres:15
environment:
POSTGRES_DB: casdoor
POSTGRES_USER: casdoor
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
networks:
- casdoor-network
networks:
casdoor-network:
driver: bridge
volumes:
db-data:
```
#### 6.1.2 Go集成代码
```go
// internal/middleware/sso.go
package middleware
import (
"context"
"encoding/json"
"net/http"
"net/url"
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
)
type SSOConfig struct {
Endpoint string // e.g., "http://localhost:8000"
ClientID string
ClientSecret string
Certificate string
OrganizationName string
ApplicationName string
}
type SSOHandler struct {
config *SSOConfig
}
func NewSSOHandler(cfg *SSOConfig) *SSOHandler {
casdoorsdk.InitConfig(
cfg.ClientID,
cfg.ClientSecret,
cfg.Certificate,
cfg.Endpoint,
cfg.OrganizationName,
cfg.ApplicationName,
)
return &SSOHandler{config: cfg}
}
// HandleCallback 处理SSO回调
func (h *SSOHandler) HandleCallback(w http.ResponseWriter, r *http.Request) {
code := r.URL.Query().Get("code")
if code == "" {
http.Error(w, "missing code", http.StatusBadRequest)
return
}
// 获取token
token, err := casdoorsdk.GetOAuthToken(code)
if err != nil {
http.Error(w, "failed to get token", http.StatusInternalServerError)
return
}
// 获取用户信息
claims, err := casdoorsdk.ParseJwtToken(token.AccessToken)
if err != nil {
http.Error(w, "failed to parse token", http.StatusInternalServerError)
return
}
// 生成内部token或session
internalToken := generateInternalToken(claims)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{
"token": internalToken,
"user": claims,
})
}
// RedirectToSSO 重定向到SSO登录
func (h *SSOHandler) RedirectToSSO(w http.ResponseWriter, r *http.Request, state string) {
authURL := casdoorsdk.GetOAuthLoginURL(state)
http.Redirect(w, r, authURL, http.StatusFound)
}
```
#### 6.1.3 SAML集成配置
Casdoor支持标准SAML 2.0可作为SP或IdP
```json
// Casdoor SAML配置示例
{
"saml": {
"enable": true,
"certificate": "-----BEGIN CERTIFICATE-----...",
"privateKey": "-----BEGIN PRIVATE KEY-----...",
"signMetadata": true,
"wantAssertionSigned": true,
"assertionConsumerServiceURL": "http://your-app/saml/callback",
"entityID": "urn:casdoor:your-app"
}
}
```
### 6.2 Keycloak集成方案
#### 6.2.1 部署架构
```yaml
# keycloak-clustered.yaml
apiVersion: v1
kind: StatefulSet
metadata:
name: keycloak
spec:
serviceName: keycloak
replicas: 2
selector:
matchLabels:
app: keycloak
template:
spec:
containers:
- name: keycloak
image: quay.io/keycloak/keycloak:26.0
args: ["start-clustered", "--db=postgres", "--db-url=jdbc:postgresql://postgres:5432/keycloak"]
env:
- name: KEYCLOAK_ADMIN
value: "admin"
- name: KEYCLOAK_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: keycloak-admin
key: password
resources:
requests:
cpu: "1"
memory: "2Gi"
limits:
cpu: "2"
memory: "4Gi"
```
#### 6.2.2 Go OIDC集成
```go
// internal/middleware/keycloak_oidc.go
package middleware
import (
"context"
"crypto/rsa"
"encoding/base64"
"encoding/json"
"fmt"
"math/big"
"net/http"
"sync"
"time"
"github.com/coreos/go-oidc/v3/oidc"
)
type KeycloakConfig struct {
IssuerURL string
ClientID string
ClientSecret string
}
type KeycloakVerifier struct {
provider *oidc.Provider
verifier *oidc.IDTokenVerifier
config *KeycloakConfig
}
func NewKeycloakVerifier(ctx context.Context, cfg *KeycloakConfig) (*KeycloakVerifier, error) {
provider, err := oidc.NewProvider(ctx, cfg.IssuerURL)
if err != nil {
return nil, fmt.Errorf("failed to create provider: %w", err)
}
verifier := provider.Verifier(&oidc.Config{
ClientID: cfg.ClientID,
})
return &KeycloakVerifier{
provider: provider,
verifier: verifier,
config: cfg,
}, nil
}
func (v *KeycloakVerifier) VerifyToken(ctx context.Context, rawToken string) (*Claims, error) {
idToken, err := v.verifier.Verify(ctx, rawToken)
if err != nil {
return nil, err
}
var claims Claims
if err := idToken.Claims(&claims); err != nil {
return nil, err
}
return &claims, nil
}
type Claims struct {
Subject string `json:"sub"`
Email string `json:"email"`
EmailVerified bool `json:"email_verified"`
Name string `json:"name"`
PreferredUsername string `json:"preferred_username"`
Groups []string `json:"groups"`
Roles []string `json:"realm_access"`
}
```
---
## 7. 风险评估
### 7.1 各方案风险矩阵
| 风险项 | Keycloak | Casdoor | Okta/Auth0 |
|--------|----------|---------|------------|
| 数据泄露风险 | 低 (自托管) | 低 (自托管) | **高 (境外存储)** |
| 服务中断风险 | 中 (自运维) | 中 (自运维) | 低 (商业SLA) |
| 供应商锁定 | 低 | 低 | **高** |
| 技术支持 | 中 (社区) | 低 (小社区) | 高 (商业支持) |
| 合规风险 | 低 | 低 | **高** |
| 性能问题 | 中 | 低 | 低 |
### 7.2 风险缓解措施
#### 风险1Casdoor社区较小
**缓解措施**
- 保持对Keycloak的兼容性预留
- 监控社区发展,适时评估迁移
- 考虑雇佣/咨询Casbin团队
#### 风险2Keycloak资源消耗高
**缓解措施**
- 使用Keycloak Operator管理集群
- 配置适当的缓存策略
- 监控资源使用,及时扩容
#### 风险3中国区网络访问IdP
**缓解措施**
- Casdoor部署在境内
- Keycloak可选择境内云托管
- 使用CDN加速静态资源
---
## 8. 实施计划
### 8.1 阶段一MVP快速上线 (1-2个月)
> **注意**:微信/钉钉OAuth对接需考虑企业资质审批时间建议MVP周期预留1-2个月
**目标**满足基本SSO需求快速验证
**任务**
1. 部署Casdoor实例 (1-2天)
2. 配置OIDC集成 (3-5天)
3. 实现Token中间件 (3-5天)
4. 对接微信/钉钉登录 (1-2周含企业资质审批)
5. SAML 2.0支持 (1周如客户需要)
6. 测试和文档 (1周)
7. 缓冲时间 (1周应对集成问题)
**交付物**
- Casdoor部署配置
- SSO集成代码
- 测试用例
- 运维文档
**成本估算**
- 人力投入1-1.5 FTE
- 基础设施¥100-500/月
### 8.2 阶段二:企业级增强 (1-2个月)
**目标**:支持更复杂的企业需求
**任务**
1. 多租户隔离强化 (1-2周)
2. MFA集成 (1周)
3. 审计日志完善 (1周)
4. 审计报表功能扩展 (1-2周)
5. Keycloak迁移路径设计 (可选)
**交付物**
- 多租户设计文档
- MFA集成方案
- 审计报表扩展方案
### 8.3 阶段三:可选迁移评估 (根据需要)
**触发条件**
- 企业客户明确要求Okta/Auth0/Azure AD
- 运维成本超出承受范围
- 目标行业需要更高级别合规认证
**评估内容**
- 迁移成本 vs 收益
- 数据出境合规影响
- 供应商锁定风险
- Keycloak vs Azure AD vs Okta 选型
---
## 9. 参考资料
### 9.1 官方文档
- Keycloak: https://www.keycloak.org/documentation
- Casdoor: https://casdoor.org/docs/
- Auth0: https://auth0.com/docs
- Okta: https://developer.okta.com/docs/
- Ory: https://www.ory.sh/docs/
- Azure AD / Microsoft Entra ID: https://www.microsoft.com/en-us/security/business/microsoft-entra-id
### 9.2 Go SDK
- `github.com/casdoor/casdoor-go-sdk`
- `github.com/coreos/go-oidc`
- `github.com/okta/okta-sdk-golang`
- `github.com/keycloak/keycloak-go`
- `github.com/microsoftgraph/msgraph-sdk-go`
- `github.com/AzureAD/microsoft-authentication-library-for-go`
### 9.3 社区资源
- Keycloak GitHub: https://github.com/keycloak/keycloak
- Casdoor GitHub: https://github.com/casdoor/casdoor
- Ory GitHub: https://github.com/ory
- Microsoft Entra ID GitHub: https://github.com/microsoftgraph/msgraph-sdk-go
---
## 10. 附录
### 附录A术语表
| 术语 | 说明 |
|------|------|
| SSO | Single Sign-On单点登录 |
| SAML | Security Assertion Markup Language安全性断言标记语言 |
| OIDC | OpenID Connect开放ID连接 |
| IdP | Identity Provider身份提供商 |
| SP | Service Provider服务提供商 |
| MFA | Multi-Factor Authentication多因素认证 |
| RBAC | Role-Based Access Control基于角色的访问控制 |
| ABAC | Attribute-Based Access Control基于属性的访问控制 |
| SCIM | System for Cross-domain Identity Management跨域身份管理系统 |
### 附录B决策树
```
开始
├─ 中国市场优先?
│ │
│ ├─ 是 ──► Casdoor (MVP) 或 Keycloak (企业)
│ │
│ └─ 否 ──► Microsoft 365客户
│ │
│ ├─ 是 ──► Azure AD/Entra ID (世纪互联版)
│ │
│ └─ 否 ──► 企业客户?
│ │
│ ├─ 是 ──► Okta/Auth0 或 Keycloak
│ │
│ └─ 否 ──► Casdoor 或 Keycloak
└─ 预算有限?
├─ 是 ──► Casdoor (自托管)
└─ 否 ──► Okta/Auth0 (SaaS) 或 Azure AD (世纪互联版)
```
---
**文档信息**
- 作者Claude AI
- 版本v1.1
- 日期2026-04-02
- 状态:已修复(根据评审意见)
- 修复内容补充Azure AD评估、深化等保合规分析、补充审计报表能力评估、修正实施周期估算