SAML 令牌和声明

安全断言标记语言 (SAML) 令牌是声明的 XML 表示形式。 默认情况下,Windows Communication Foundation (WCF) 在联合安全方案中使用的 SAML 令牌称为颁发的令牌。

SAML 令牌包含由一个实体所生成的关于另一实体的多组声明的语句。 例如,在联合安全方案中,语句是由安全令牌服务针对系统中的某一用户所生成的。 安全令牌服务将对 SAML 令牌进行签名,以指示令牌中所包含语句的真实性。 此外,SAML 令牌与 SAML 令牌用户确实了解的加密密钥材料关联。 这就向依赖方证明了 SAML 令牌实际上是颁发给该用户的。 例如,在典型的方案中:

  1. 客户端向安全令牌服务请求 SAML 令牌,并通过使用 Windows 证书对该安全令牌服务进行身份验证。

  2. 安全令牌服务向客户端颁发 SAML 令牌。 SAML 令牌使用与安全令牌服务关联的证书进行签名,并包含针对目标服务所加密的校验密钥。

  3. 客户端还将接收证明密钥的副本, 然后将 SAML 令牌提交到应用程序服务(信赖方),并使用该证明密钥对消息进行签名。

  4. 依赖方可通过 SAML 令牌上的签名了解到,该令牌是由安全令牌服务颁发的; 依赖方还可通过使用校验密钥创建的消息签名了解到,该令牌是颁发给客户端的。

从 Claim 到 SamlAttribute

在 WCF 中,SAML 令牌中的语句是作为 SamlAttribute 对象建模的,可以直接从 Claim 对象填充,前提是 Claim 对象的 Right 属性为 PossessProperty,并且 Resource 属性的类型为 String。 例如:

Claim myClaim = new Claim(
    ClaimTypes.GivenName, "Martin", Rights.PossessProperty);
SamlAttribute sa = new SamlAttribute(myClaim);
Dim myClaim As New Claim(ClaimTypes.GivenName, "Martin", _
Rights.PossessProperty)
Dim sa As New SamlAttribute(myClaim)

注意

如果 SAML 令牌在消息中序列化,无论是在安全令牌服务颁发这些令牌时,还是在客户端将其作为身份验证的一部分提交到服务中时,最大消息大小配额都必须足够大,以便能够容纳 SAML 令牌和其他消息部分。 正常情况下,默认消息大小配额足够使用。 但是,如果 SAML 令牌由于包含数以百计的声明而过于庞大,您可能需要提高配额,以便容纳序列化的令牌。 有关详细信息,请参阅数据的安全注意事项

从 SamlAttribute 到 Claim

在消息中接收到 SAML 令牌时,SAML 令牌中的各种语句将转换为 IAuthorizationPolicy 对象,并放置在 AuthorizationContext 中。 来自每个 SAML 语句的声明将由 ClaimSetsAuthorizationContext 属性返回,并可对这些声明进行检查,以确定是否对该用户进行身份验证和授权。

另请参阅