Skip to content

SSO企业认证系统

模块概述

版本: v0.34.0 状态: ✅ 已实现 IPC处理器: 20个 最后更新: 2026-02-15

企业级单点登录(SSO)认证系统,支持 SAML 2.0、OAuth 2.0 和 OpenID Connect 三种主流协议。提供 DID 与企业身份双向绑定、加密令牌存储和自动会话刷新。

核心特性

  • 多协议支持: SAML 2.0, OAuth 2.0, OpenID Connect (OIDC)
  • PKCE 安全: OAuth/OIDC 流程强制使用 PKCE (Proof Key for Code Exchange)
  • DID 身份桥接: 企业SSO身份与 DID 身份双向绑定
  • 加密令牌存储: AES-256-GCM 加密存储所有令牌
  • 自动刷新: 令牌过期前自动刷新,无缝用户体验
  • 证书校验: SAML 签名验证和证书链校验

1. 架构设计

1.1 整体架构图

┌──────────────────────────────────────────────────────────────────┐
│                        前端 (Vue3)                                │
├──────────────────────────────────────────────────────────────────┤
│  SSOConfiguration │ SSOLogin │ IdentityLinking │ SessionManager  │
│        ↓                ↓            ↓                ↓           │
│                     Pinia Store: sso.ts                           │
└──────────────────────────────────────────────────────────────────┘
                              ↕ IPC (20个通道)
┌──────────────────────────────────────────────────────────────────┐
│                        主进程 (Electron)                          │
├──────────────────────────────────────────────────────────────────┤
│                      sso-ipc.js (20个处理器)                      │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │  SSOManager  │  SAMLProvider  │  OAuthProvider  │  OIDCExt │  │
│  └────────────────────────────────────────────────────────────┘  │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │  SSOSessionManager  │  IdentityBridge  │  Database         │  │
│  └────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────┘
                              ↕ HTTPS
┌──────────────────────────────────────────────────────────────────┐
│                     外部身份提供商 (IdP)                          │
├──────────────────────────────────────────────────────────────────┤
│  Azure AD │ Okta │ Google Workspace │ OneLogin │ 自建LDAP/AD     │
└──────────────────────────────────────────────────────────────────┘

1.2 认证流程 (OAuth 2.0 + PKCE)

用户点击SSO登录

SSOManager 生成 code_verifier + code_challenge

打开浏览器窗口 → IdP 授权页面

用户在IdP完成认证

IdP 重定向回调 → 携带 authorization_code

OAuthProvider 用 code + code_verifier 换取 tokens

获取 userinfo → 创建/关联本地会话

SSOSessionManager 加密存储 tokens

IdentityBridge 绑定 DID ↔ SSO 身份

1.3 核心组件

组件文件行数说明
SSOManagersso-manager.js~500多提供商协调器
SAMLProvidersaml-provider.js~420SAML 2.0 SP实现
OAuthProvideroauth-provider.js~380OAuth 2.0 + PKCE
SSOSessionManagersso-session-manager.js~350加密令牌存储
IdentityBridgeidentity-bridge.js~300DID ↔ SSO身份桥接
SSOIpcsso-ipc.js~32020个IPC处理器

2. 核心模块

2.1 SSOManager

多提供商协调器,统一管理所有 SSO 配置和认证流程。

功能特性:

  • 多提供商同时配置和管理
  • 统一的登录/登出接口
  • 提供商健康检查
  • PKCE 参数生成

核心方法:

javascript
class SSOManager {
  // 获取所有SSO配置
  async getConfigurations() { }

  // 创建SSO配置
  async createConfiguration(data) { }

  // 更新SSO配置
  async updateConfiguration(configId, updates) { }

  // 删除SSO配置
  async deleteConfiguration(configId) { }

  // 测试SSO连接
  async testConnection(configId) { }

  // 发起SSO登录
  async initiateLogin(configId) { }

  // 处理SSO回调
  async handleCallback(configId, callbackData) { }

  // SSO登出
  async logout(configId) { }

  // 生成PKCE参数
  generatePKCE() { }
}

2.2 SAMLProvider

SAML 2.0 服务提供商 (SP) 实现。

功能特性:

  • SP 元数据生成和导出
  • AuthnRequest 构建和发送
  • SAML Assertion 解析和验证
  • 签名和证书验证
  • NameID 格式支持 (email, persistent, transient)

核心方法:

javascript
class SAMLProvider {
  // 生成SP元数据
  generateMetadata(config) { }

  // 构建AuthnRequest
  buildAuthnRequest(config) { }

  // 解析SAML Response
  parseResponse(samlResponse) { }

  // 验证Assertion签名
  validateAssertion(assertion, certificate) { }

  // 提取用户属性
  extractAttributes(assertion) { }
}

SAML 配置:

javascript
{
  protocol: 'saml',
  entityId: 'chainlesschain-desktop',
  assertionConsumerServiceUrl: 'http://localhost:18800/saml/callback',
  idpMetadataUrl: 'https://idp.example.com/metadata',
  idpCertificate: '-----BEGIN CERTIFICATE-----...',
  nameIdFormat: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
  signRequests: true,
  wantAssertionsSigned: true
}

2.3 OAuthProvider

OAuth 2.0 授权码 + PKCE 流程实现,同时支持 OpenID Connect 扩展。

功能特性:

  • 授权码流程 (Authorization Code Grant)
  • PKCE 强制启用 (code_challenge_method: S256)
  • 令牌刷新 (Refresh Token)
  • UserInfo 端点调用
  • OIDC ID Token 解析和验证

核心方法:

javascript
class OAuthProvider {
  // 构建授权URL
  buildAuthorizationUrl(config, pkce) { }

  // 用授权码换取令牌
  async exchangeCode(config, code, codeVerifier) { }

  // 刷新令牌
  async refreshToken(config, refreshToken) { }

  // 获取用户信息
  async getUserInfo(config, accessToken) { }

  // 验证ID Token (OIDC)
  async verifyIdToken(config, idToken) { }

  // 撤销令牌
  async revokeToken(config, token) { }
}

OAuth/OIDC 配置:

javascript
{
  protocol: 'oauth2', // 或 'oidc'
  clientId: 'chainlesschain-desktop',
  // clientSecret 不存储 (Public Client, 使用PKCE)
  authorizationUrl: 'https://idp.example.com/authorize',
  tokenUrl: 'https://idp.example.com/token',
  userInfoUrl: 'https://idp.example.com/userinfo',
  redirectUri: 'http://localhost:18800/oauth/callback',
  scopes: ['openid', 'profile', 'email'],
  codeChallengeMethod: 'S256'
}

2.4 SSOSessionManager

SSO 会话管理器,使用 AES-256-GCM 加密存储令牌。

功能特性:

  • 令牌加密存储 (AES-256-GCM)
  • 自动刷新 (过期前 5 分钟)
  • 会话状态跟踪
  • 多会话管理

核心方法:

javascript
class SSOSessionManager {
  // 创建会话
  async createSession(configId, tokens, userInfo) { }

  // 获取会话
  async getSession(sessionId) { }

  // 获取活跃会话列表
  async getActiveSessions() { }

  // 刷新会话
  async refreshSession(sessionId) { }

  // 销毁会话
  async destroySession(sessionId) { }

  // 检查会话有效性
  async isSessionValid(sessionId) { }

  // 加密令牌
  encryptToken(token) { }

  // 解密令牌
  decryptToken(encryptedToken) { }
}

加密方案:

javascript
// AES-256-GCM 加密
const algorithm = 'aes-256-gcm';
const keyDerivation = 'PBKDF2(masterKey, salt, 100000, 32, sha512)';
// IV: 每次加密随机生成12字节
// AuthTag: 16字节认证标签

2.5 IdentityBridge

DID 与 SSO 身份双向绑定桥接。

功能特性:

  • DID → SSO 身份查找
  • SSO 身份 → DID 查找
  • 一个 DID 可绑定多个 SSO 身份
  • 绑定/解绑管理
  • 身份冲突检测

核心方法:

javascript
class IdentityBridge {
  // 绑定 DID 和 SSO 身份
  async linkIdentity(did, ssoProvider, ssoUserId, attributes) { }

  // 解绑身份
  async unlinkIdentity(did, ssoProvider) { }

  // DID → SSO 身份查找
  async getSSOIdentities(did) { }

  // SSO → DID 查找
  async getDIDForSSO(ssoProvider, ssoUserId) { }

  // 获取所有身份映射
  async getAllMappings(filters) { }

  // 检查身份冲突
  async checkConflict(ssoProvider, ssoUserId) { }
}

3. 数据模型

3.1 sso_configurations

字段类型说明
idTEXT PK配置ID (UUID)
nameTEXT显示名称 (如 "Azure AD")
protocolTEXT协议类型 (saml/oauth2/oidc)
provider_typeTEXT提供商类型 (azure_ad/okta/google/custom)
configTEXT(JSON)协议配置 (加密存储)
enabledBOOLEAN是否启用
metadataTEXT(JSON)提供商元数据
created_atINTEGER创建时间
updated_atINTEGER更新时间
last_testedINTEGER最后测试时间
test_statusTEXT测试状态 (success/failed)

3.2 sso_sessions

字段类型说明
idTEXT PK会话ID (UUID)
config_idTEXT FKSSO配置ID
didTEXT关联的DID
access_tokenTEXT加密的访问令牌
refresh_tokenTEXT加密的刷新令牌
id_tokenTEXT加密的ID令牌 (OIDC)
token_expires_atINTEGER令牌过期时间
user_infoTEXT(JSON)用户信息
statusTEXT状态 (active/expired/revoked)
created_atINTEGER创建时间
last_refreshedINTEGER最后刷新时间

3.3 identity_mappings

字段类型说明
idTEXT PK映射ID (UUID)
didTEXTDID身份
sso_providerTEXTSSO提供商标识
sso_user_idTEXTSSO用户ID
sso_emailTEXTSSO邮箱
sso_display_nameTEXTSSO显示名称
attributesTEXT(JSON)附加属性
linked_atINTEGER绑定时间
last_loginINTEGER最后登录时间

唯一约束: UNIQUE(sso_provider, sso_user_id) - 每个 SSO 身份只能绑定一个 DID。


4. IPC接口 (20个)

4.1 SSO配置管理 (6个)

通道说明参数
sso:get-configurations获取所有配置-
sso:create-configuration创建配置data:
sso:update-configuration更新配置configId: string, updates: object
sso:delete-configuration删除配置configId: string
sso:test-connection测试连接configId: string
sso:get-provider-templates获取预设模板-

4.2 认证流程 (4个)

通道说明参数
sso:initiate-login发起SSO登录configId: string
sso:handle-callback处理回调configId: string, callbackData: object
sso:logoutSSO登出configId: string
sso:get-login-url获取登录URLconfigId: string

4.3 会话管理 (4个)

通道说明参数
sso:get-active-sessions获取活跃会话-
sso:refresh-session刷新会话sessionId: string
sso:destroy-session销毁会话sessionId: string
sso:check-session检查会话有效性sessionId: string

4.4 身份桥接 (4个)

通道说明参数
sso:link-identity绑定身份did: string, ssoProvider: string, ssoUserId: string
sso:unlink-identity解绑身份did: string, ssoProvider: string
sso:get-identity-mappings获取映射did: string
sso:get-all-mappings获取所有映射filters: object

4.5 SAML专用 (2个)

通道说明参数
sso:export-sp-metadata导出SP元数据configId: string
sso:import-idp-metadata导入IdP元数据configId: string, metadataXml: string

5. 前端页面

5.1 SSOConfigurationPage.vue

SSO 配置管理页:

  • 已配置的 SSO 提供商列表
  • 新增配置向导 (选择协议 → 填写参数 → 测试连接)
  • 预设模板: Azure AD, Okta, Google Workspace, OneLogin
  • 连接测试结果显示
  • 启用/禁用切换
  • SAML SP 元数据导出按钮

5.2 SSOLoginPage.vue

SSO 登录页:

  • 已启用的 SSO 提供商按钮列表
  • 提供商 Logo 和名称展示
  • 登录状态反馈 (进行中/成功/失败)
  • 回退到本地登录选项

5.3 IdentityLinkingPage.vue

身份绑定管理:

  • 当前 DID 身份信息展示
  • 已绑定的 SSO 身份列表
  • 新增绑定流程 (选择提供商 → SSO认证 → 确认绑定)
  • 解绑确认对话框
  • 身份冲突提示

5.4 Pinia Store: sso.ts

typescript
interface SSOState {
  configurations: SSOConfiguration[];
  activeSessions: SSOSession[];
  identityMappings: IdentityMapping[];
  providerTemplates: ProviderTemplate[];
  loginState: 'idle' | 'pending' | 'success' | 'error';
  currentConfig: SSOConfiguration | null;
  loading: boolean;
}

interface SSOConfiguration {
  id: string;
  name: string;
  protocol: 'saml' | 'oauth2' | 'oidc';
  providerType: string;
  config: Record<string, any>;
  enabled: boolean;
  testStatus: 'success' | 'failed' | null;
}

6. 安全设计

6.1 PKCE (Proof Key for Code Exchange)

  • OAuth/OIDC 流程强制使用 PKCE
  • code_verifier: 43-128字符随机字符串
  • code_challenge: SHA-256(code_verifier) 的 Base64url 编码
  • 防止授权码拦截攻击

6.2 令牌加密存储

  • 所有令牌使用 AES-256-GCM 加密后存储
  • 加密密钥通过 PBKDF2 从主密钥派生
  • 每个令牌独立的 IV (初始化向量)
  • 16字节认证标签确保完整性

6.3 证书校验

  • SAML Assertion 签名验证
  • IdP 证书链校验
  • 证书过期检查
  • 支持证书轮换

6.4 会话安全

  • 会话令牌过期前 5 分钟自动刷新
  • 异常刷新失败自动销毁会话
  • 多设备会话互斥 (可配置)
  • 登出时通知 IdP (SAML SLO / OAuth Revoke)

6.5 回调安全

  • 回调 URL 使用 localhost 端口 (18800)
  • state 参数防 CSRF 攻击
  • 回调仅接受一次 (Nonce 校验)

7. 文件结构

desktop-app-vue/src/main/sso/
├── sso-manager.js           # 多提供商协调器
├── saml-provider.js         # SAML 2.0 SP实现
├── oauth-provider.js        # OAuth 2.0 + PKCE
├── sso-session-manager.js   # 加密令牌管理
├── identity-bridge.js       # DID ↔ SSO桥接
└── sso-ipc.js               # 20个IPC处理器

desktop-app-vue/src/renderer/
├── pages/sso/
│   ├── SSOConfigurationPage.vue  # SSO配置管理
│   ├── SSOLoginPage.vue          # SSO登录页
│   └── IdentityLinkingPage.vue   # 身份绑定管理
└── stores/sso.ts                 # SSO状态管理

8. 相关文档


文档版本: 1.0 最后更新: 2026-02-15

ChainlessChain 系统设计文档 — 面向开发者