单点登录的核心机制:CAS 协议、令牌与 ASP 应用集成
本文从工程视角剖析单点登录(SSO)的三大支柱——统一身份源、令牌签发与校验、集中审计,并以 CAS 协议为例给出 ASP/ASP.NET 应用的集成思路,适合需要把多个业务系统(尤其是存量 ASP 应用)统一到一套身份认证体系的架构师与运维工程师。
1. 问题定义
单点登录(SSO)解决的是"身份碎片化":当企业存在多个相互信任的业务系统(Service Provider,SP)时,用户应当只在统一的认证服务器(Identity Provider,IdP)登录一次,即可访问所有 SP,而无需在每个系统重复认证。
传统分散认证的结构性缺陷:
- 密码散落:每个 SP 各自保管用户口令,泄露面成倍扩大。
- 账号不一致:同一人在不同系统用户名/状态各异,禁用不彻底。
- 审计割裂:登录行为各记各的,无法形成统一轨迹。
- 强认证难推广:双因子要在每个系统分别改造,成本高。
2. 架构模型
用户 ──①访问SP──▶ SP(校验令牌,不存密码)
│ │
│ ②重定向登录 │ ③携带 ST 校验
▼ ▼
CAS 统一认证服务器(IdP)
├── 账号源(AD / LDAP / 数据库)
├── 签发 TGC(全局票据)/ ST(服务票据)
├── 多因素认证(UKEY / 人脸)
└── 统一审计日志(append-only)
核心约束:业务系统不直接保管用户长期口令,只信任 IdP 签发的、带有效期的令牌。
3. CAS 协议流程
- 用户访问 SP,SP 发现未认证,重定向至 CAS 登录页(携带
service参数)。 - 用户在 CAS 完成认证,CAS 写全局票据 TGC,并重定向回 SP,附带服务票据
ST。 - SP 后端以
ST调用 CAS 的/serviceValidate校验。 - CAS 返回用户标识,SP 建立局部会话并放行。
- 访问其他 SP 时,CAS 凭已有 TGC 直接签发新 ST,无需再次输入密码。
4. ASP/ASP.NET 集成
存量 ASP 系统接入关键是认证中间件,不改动业务核心逻辑:
// 未登录重定向 CAS
if (!ctx.User.Identity.IsAuthenticated)
{
var url = $"https://sso.example.com/cas/login?service={Encode(ctx.Request.GetDisplayUrl())}";
ctx.Response.Redirect(url);
return;
}
// 回调校验 ST
var xml = await http.GetStringAsync(
$"https://sso.example.com/cas/serviceValidate?ticket={ticket}&service={service}");
if (CasValidateSuccess(xml, out var user))
await ctx.SignInAsync(BuildPrincipal(user)); // 建立本地会话
新建服务使用官方 CAS 客户端库,接法一致,认证职责完全上收至 IdP。
5. 令牌与会话安全
- ST 一次性短时效:校验即失效,防重放。
- TGC 加密 Cookie:HttpOnly + Secure,仅存于浏览器。
- 全程 HTTPS:登录与票据校验均加密。
- 单点登出(SLO):IdP 退出时广播通知各 SP 销毁局部会话。
6. 与强认证、国密合规的边界
单点登录负责"统一身份",登录强度由 IdP 统一收敛:
- 多因素认证:在 CAS 登录环节叠加 UKEY、手机令牌或人脸/指纹,满足等保双因子。
- 国密合规:IdP 支持国密 SM2/SM4,令牌签名与传输符合密评要求。
这样,存量 ASP 系统无需逐个改造认证强度,只在中间件层信任 IdP 即可。
7. 工程落地建议
- 先梳理账号源与系统清单,确定接入优先级。
- IdP 先行:打通账号源与强认证策略。
- 业务系统增加 CAS 客户端中间件,移除本地密码登录。
- 启用单点登出与统一审计日志。
- 灰度切换:先非核心系统,验证通过后全面推广。
本文为技术实现分析,所涉统一认证、强认证与国密能力可结合实际身份基础设施落地。