SAML断言是SAML协议中承载用户身份与授权信息的核心XML片段,嵌入于Response等协议消息中,包含AuthnStatement、AttributeStatement等声明,并通过签名、Conditions、SubjectConfirmation等机制保障安全。
SAML断言(SAML Assertion)是SAML协议中承载用户身份和授权信息的核心XML片段,用于在身份提供者(IdP)和服务提供者(SP)之间安全传递认证与属性数据。它不是完整HTTP请求或响应,而是嵌入在SAML协议消息(如Response)中的一个结构化部分。
一个基础的SAML 2.0 元素包含三个可选但常见的核心声明(Stat
ement):认证声明(AuthnStatement)、属性声明(AttributeStatement)和授权决策声明(AuthorizationDecisionStatement)。最常见的是前两者。
简化示例(去除了签名、命名空间缩写等细节,便于理解逻辑):
xmlns="urn:oasis:names:tc:SAML:2.0:assertion">关键组成部分说明:
NameID 是SP用来识别该用户的主键(如邮箱、ID字符串)InResponseTo防篡改NotBefore/NotOnOrAfter)和作用域(Audience限制只能给哪个SP用)SAML SSO本质是“一次认证,多处访问”:用户只需向IdP登录一次,后续访问已信任的SP时无需重复输入账号密码。整个流程由三方协作完成——浏览器(User Agent)、服务提供者(SP)、身份提供者(IdP)。
典型Web SSO流程(SP重定向绑定):
AuthnRequest 并重定向浏览器到IdP的SSO端点AuthnRequest(通常Base64编码+URL参数)到达IdP;IdP验证请求合法性(签名、目标SP是否受信)Response(含签名),通过浏览器自动提交HTML表单(POST)回SP的断言消费端点(ACS URL)Response后:校验签名、验证Issuer/Audience/Conditions、解析Assertion中的NameID和Attribute,建立本地会话安全关键点:
Response和Assertion)必须由IdP签名,SP必须用IdP公钥验证,防止伪造SubjectConfirmation 和 Conditions 防止断言被截获重放或跨SP滥用Audience值是否等于自身实体ID,避免“断言劫持”NameID在SP上下文中具有唯一性和稳定性(如使用持久ID而非邮箱,避免邮箱变更导致会话中断)基本上就这些。SAML断言不是黑盒,而是一份有明确语义、带多重保护机制的结构化凭证;SSO也不是魔法,是靠严谨的协议步骤、加密签名和策略校验协同实现的信任传递。