统一身份认证
  1. 登录过程接口
统一身份认证
3.0
  • 3.0
  • 公开接口
    • 3.0接口说明
    • OpenAPI
      • 概述
      • 1.人员管理
        • 批量获取人员数据
        • 获取单个人员数据
        • 添加单个人员数据
        • 修改单个人员数据
        • 删除单个人员数据
        • 批量获取人员照片
        • 获取单个人员照片
        • 基本代码
        • 人员类型代码
        • 组织机构代码
      • 2.服务管理
        • 获取服务列表数据
        • 批量删除服务数据
        • 获取单个服务数据
        • 添加单个服务数据
        • 修改单个服务数据
        • 删除单个服务数据
        • 获取服务列表数据(LDAP)
        • 批量删除服务数据(LDAP)
        • 获取单个服务数据(LDAP)
        • 添加单个服务数据(LDAP)
        • 修改单个服务数据(LDAP)
        • 删除单个服务数据(LDAP)
        • 返回属性代码
        • 黑白名单标签代码
      • 3.资源管理
        • 图像资源
      • 获取TOKEN
      • DEMO
    • 登录过程接口
      • SAML 2.0 对接文档
      • CAS协议-登录接口
        GET
      • CAS协议-票据验证接口
        GET
      • 登出接口
        GET
      • 用户身份切换
        GET
      • SAML1.1协议-登录接口
        GET
      • SAML1.1协议-票据验证接口
        POST
      • 单点登出接口
        POST
    • RestfulApi
      • 第一步 获取tickets
      • 第二步 获取ST
      • 第三部获取用户信息
  1. 登录过程接口

SAML 2.0 对接文档

1. 系统角色说明#

本 SSO 系统作为 SAML 2.0 身份提供者(IdP),负责用户认证并颁发身份断言。
角色名称职责
IdP本 SSO 系统认证用户身份,生成 SAML 断言
SP第三方应用系统接收断言,授权用户访问资源

2. 认证流程#

用户 → 第三方应用(SP) → SSO 登录(IdP) → 用户认证 → 返回断言 → SP 创建会话

完整流程说明#

1.
用户访问第三方应用受保护资源
2.
SP 检测到未登录,重定向到 SSO 登录页面,携带 TARGET 参数
3.
用户在 SSO 完成身份认证
4.
SSO 生成 SAMLart(票据),重定向回 SP
5.
SP 使用 SAMLart 调用验证接口获取用户信息
6.
SP 验证断言后创建本地会话

3. 接口规范#

3.1 登录页面#

接口地址
GET {SSO_HOST}/cas/login?TARGET={回调地址}
请求参数
参数类型必填说明
TARGETString是SP 的回调地址,需进行 URL 编码
示例
响应
展示登录页面供用户输入凭证
登录成功后重定向到 TARGET,携带 SAMLart 参数
回调示例
https://app.example.com/saml/callback?SAMLart=ST-12345-xxxxx

3.2 断言验证接口#

接口地址
GET {SSO_HOST}/cas/serviceValidate?SAMLart={票据}&TARGET={回调地址}
请求参数
参数类型必填说明
SAMLartString是登录成功后返回的票据
TARGETString是SP 的回调地址(与登录时一致)
请求示例
成功响应
HTTP Status: 200
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" 
                 xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
                 ID="_uuid" 
                 Version="2.0" 
                 IssueInstant="2026-01-16T10:00:00Z"
                 InResponseTo="https://app.example.com/saml/callback"
                 Destination="https://app.example.com/saml/callback">
  
  <saml2:Issuer>https://sso.example.com</saml2:Issuer>
  
  <saml2p:Status>
    <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
  </saml2p:Status>
  
  <saml2:Assertion ID="_uuid" Version="2.0" IssueInstant="2026-01-16T10:00:00Z">
    <saml2:Issuer>https://sso.example.com</saml2:Issuer>
    
    <saml2:Subject>
      <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">用户ID</saml2:NameID>
      <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <saml2:SubjectConfirmationData 
          NotOnOrAfter="2026-01-16T10:05:00Z" 
          Recipient="https://app.example.com/saml/callback"
          InResponseTo="https://app.example.com/saml/callback"/>
      </saml2:SubjectConfirmation>
    </saml2:Subject>
    
    <saml2:Conditions 
      NotBefore="2026-01-16T10:00:00Z" 
      NotOnOrAfter="2026-01-16T10:05:00Z">
      <saml2:AudienceRestriction>
        <saml2:Audience>https://app.example.com/saml/callback</saml2:Audience>
      </saml2:AudienceRestriction>
    </saml2:Conditions>
    
    <saml2:AuthnStatement AuthnInstant="2026-01-16T10:00:00Z">
      <saml2:AuthnContext>
        <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
      </saml2:AuthnContext>
    </saml2:AuthnStatement>
    
    <saml2:AttributeStatement>
      <saml2:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
        <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">zhangsan</saml2:AttributeValue>
      </saml2:Attribute>
      <saml2:Attribute Name="name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
        <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">张三</saml2:AttributeValue>
      </saml2:Attribute>
      <saml2:Attribute Name="phone" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
        <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">13800138000</saml2:AttributeValue>
      </saml2:Attribute>
      <saml2:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
        <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">zhangsan@example.com</saml2:AttributeValue>
      </saml2:Attribute>
    </saml2:AttributeStatement>
    
  </saml2:Assertion>
</saml2p:Response>
失败响应
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" 
                 xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
                 ID="_uuid" 
                 Version="2.0" 
                 IssueInstant="2026-01-16T10:00:00Z">
  
  <saml2:Issuer>https://sso.example.com</saml2:Issuer>
  
  <saml2p:Status>
    <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:RequestDenied"/>
    <saml2p:StatusMessage>Ticket不存在</saml2p:StatusMessage>
  </saml2p:Status>
  
</saml2p:Response>

4. 用户信息提取#

4.1 用户唯一标识#

从 saml2:NameID 元素获取:
<saml2:NameID>zhangsan</saml2:NameID>
解析示例(Java)

4.2 用户属性#

从 saml2:AttributeStatement 获取所有用户属性:
解析示例(Java)

4.3 标准属性列表#

属性名说明示例
uid用户唯一标识zhangsan
name用户姓名张三
phone手机号13800138000
email邮箱zhangsan@example.com
employee_number工号20210001
type用户类型L01
auth_ip认证IP192.168.1.100
注:实际返回的属性由服务配置决定,可根据业务需求定制。

5. 服务配置#

第三方应用需在 SSO 后台注册服务信息。

6.SAML 规范#

项目值
SAML 版本2.0
协议命名空间urn:oasis:names:tc:SAML:2.0:protocol
断言命名空间urn:oasis:names:tc:SAML:2.0:assertion
SubjectConfirmation 方法urn:oasis:names:tc:SAML:2.0:cm:bearer
NameID 格式urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
属性格式urn:oasis:names:tc:SAML:2.0:attrname-format:uri

7. 错误码说明#

状态码说明原因
Success认证成功-
RequestDenied请求被拒绝票据无效、已使用或不存在
Responder响应错误服务配置错误、权限不足
常见错误原因
1.
Ticket不存在 - 票据已过期或从未生成
2.
Ticket已经被使用过 - 票据重复使用(仅允许使用一次)
3.
Service compare failed - TARGET 不在服务白名单中
4.
IP access denied - 用户IP不在允许范围内
5.
User access denied - 用户无访问该服务的权限

8. 测试方法#

8.1 完整流程测试#

步骤1:访问登录页面
步骤2:登录获取票据
在浏览器完成登录,系统会重定向到:
https://app.example.com/callback?SAMLart=ST-12345-xxxxx
步骤3:验证票据

8.2 常见测试场景#

场景1:正常认证
访问登录页面 → 登录成功 → 获取票据 → 验证票据 → 获取用户信息
场景2:票据过期
使用超过10秒的票据 → 返回 "Ticket不存在"
场景3:票据重复使用
使用同一票据验证两次 → 第二次返回 "Ticket已经被使用过"
场景4:URL不匹配
使用未注册的 TARGET → 返回 "Service compare failed"

文档版本: v1.0
更新日期: 2026-01-16
修改于 2026-01-16 02:01:54
上一页
DEMO
下一页
CAS协议-登录接口
Built with