标题：SAML
定义
SAML（Security Assertion Markup Language）是一个XML框架，也就是一组协议和规范，可以用来传输企业用户身份证明， 主要是企业外的身份跨域传递。比如，公司（idp）的用户要访问SAAS 应用（sp），为了保证身份安全，我们可以采用除了加密签名等措施，还要采用SAML规范来传输，传输的数据以XML形式，内容符合SAML的推荐标准，这样我们就可以不要求idp和sp采用什么样的系统，只要求能理解SAML规范即可，显然比传统的方式更好。SAML 规范是一组Schema 定义。 
可以这么说，在Web Service 领域，schema就是规范，在Java领域，API就是规范。
背景
安全是所有Web项目在设计时都要考虑的一个重要因素。无论是选择最短口令，决定何时使用SSL加密HTTP会话，还是通过自动登录cookie来识别用户，都经常要付出重大的设计努力，以保护用户的身份信息和他们可能存放于Web站点的其他资料。糟糕的安全性可能带来公关灾难。当最终用户努力保持对其个人信息的控制时，他们要面临令人迷惑的隐私政策，需要牢记众多站点的不同口令，以及遭遇“钓鱼式攻击”事件。在宏观层次上，数字身份引起了许多复杂的技术和社会问题，业界一些团体如Liberty Alliance和IdentityGang都正试图通过开发新的技术标准来解决它们。在较小的规模上，可以使用一些工具来为用户提供更好的安全性。请考虑口令管理问题。用户访问他们保存个人资料的Web站点，在可以存取他们的资料之前必须经过验证。通过验证来鉴别用户，确保他们是所声称的用户。进行验证最简单方式是使用口令。然而，若每个站点都需要各自的一套口令，用户将有难以控制的大量口令。1998年微软首先尝试通过其Passport network提供该问题的全球解决方案。Passport使得任意Web站点使用用户提交给Passport的个人资料（如用户名、地址、信用卡号）成为可能。Passport是单点登录（single sign-on，SSO）的第一次电子商务尝试。它没有流行起来，部分原因是由于人们对系统封闭性的担心。然而，SSO的理念非常引人注目，许多开放标准和商业计划都追随Passport其后。通过SSO，某个Web站点可以与其他站点共享用户身份信息。 SSO对于使用应用服务提供商（Application Service Provider，ASP）软件服务的企业特别有用。ASP在自己的服务器上宿主应用程序，出售其访问权作为服务。公司可以在它的标准目录服务器里管理自己的用户和口令，然后通过SSO授予用户访问ASP应用程序的权限。SSO允许公司管理自己用户的信息，不必为每一员工维护多个用户账号。对用户来说，SSO的好处在于他们可以在多个应用程序中使用一个用户名和口令，并且在应用程序之间切换时无需重新验证。SSO不仅仅用于Web应用程序，它可用于任何类型的应用程序，只要有安全地传送身份信息的协议。这种通信方式的开放标准就是安全性断言标记语言（SAML）。
SAML的应用随着云计算的发展而得到了更快的推广。越来越多的企业意识到，在每一个SAAS厂商维护一套用户名和密码是一件费时费力的事情， 寻求将企业内的身份认证扩展到SAAS应用中。领先的SAAS应用厂商如Google, Salesforce纷纷提供SAML的单点登录接口。 Sun 推出了一个开源的Java 项目OPENSSO，看起来一度前景美妙， 随着Oracle的收购，这一项目似乎搁浅了（Oracle 有自己的支持saml的商用平台）。IBM,CA 等不甘落后，纷纷推出自己的产品。 Microsoft的ADFS声称支持SAML 2.0(不支持1.1).这些产品的共同特点是兼容性不高， 和自己的产品线结合还算不错， 但是和其它厂商的产品互联有局限性。 异军突起的是一个总部位于美国的丹佛的Pingidentity。 它推出的Pingfederate， 基于Java 平台，除了支持SAML 2.0和1.1外， 还支持WS-Federation (微软主推)，近两年又推出支持Oauth的版本（6.6以后）。除了产品，该公司还网拢了一批业界资深的人士， 积极参与SAML的标准制定和应用推广。 可以看到， SAML的应用得到了领先的企业和SAAS应用厂商的大力支持, 目前上百家SAAS厂商 [1]声称自己支持SAML单点登录。
SAML 作用
SAML 主要包括三个方面： 
1.认证申明。表明用户是否已经认证，通常用于单点登录。 
2.属性申明。表明 某个Subject 的属性。 
3.授权申明。表明 某个资源的权限。
SAML框架
简单说， SAML就是一方向另一方发送SAML 请求，然后另一方返回SAML响应。数据的传输以符合SAML规范的XML格式表示。 连接中的任何一方都可以发起请求， 根据身份不同， 可以说是IDP init请求， 或是SP init 请求。 
这里以SAML实现的业界领先厂商的PingFederate为例，来说说IDP init SSO （详细流程可以参阅参考资料）。 这个是用户通过LDAP 等登录到IDP域后， IDP 给已经登录的用户生成一个SAML Asseration， 这里包括员工的身份信息。 这个信息通过SSL加密传递到SP 后， SP 先验证签名（Sign）， 解析出这是一个来自某公司某员工的请求， 要访问它的某个应用程序（Relaystat）, SP 会继续把这个要求传递给自己的应用程序， 由它来决定授权。 
<Response Destination="<http_protocol>://sp:9031/sp/ACS.saml2" IssueInstant="2011-06-21T18:45:05.541Z" ID="mlFj46Z1ac5.Og0XRUQng9I9PZA" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:ds="<http_protocol>://org/2000/09/xmldsig#">
<saml:Issuer>idp:cloud:saml2</saml:Issuer>
<ds:Signature>
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="<http_protocol>://org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="<http_protocol>://org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#mlFj46Z1ac5.Og0XRUQng9I9PZA">
<ds:Transforms>
<ds:Transform Algorithm="<http_protocol>://org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="<http_protocol>://org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="<http_protocol>://org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>lhx/bdl8SDvYFlTORdnkMGSn9IE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>ko2nIwlZN4vjtSWWDHwL+eF+uZKyFENdBP7f97jALUIAoWo37hc03koaKo2Q2Dbq7thv+BXVuEPr
FYjhaS8rKUXPhETx4k4GMCEqMCGHuPAX1WanBHp4Pj1AV+WJdlijIalrGQaxRPhxlBGD5iR1i2fm
ca+Kd5eHfuXZOav3lf0=</ds:SignatureValue>
</ds:Signature>
<Status>
<StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</Status>
<saml:Assertion Version="2.0" IssueInstant="2011-06-21T18:45:05.619Z" ID="IbDavCE__pPV99SnSP5aFX8ZVtZ">
<saml:Issuer>idp:cloud:saml2</saml:Issuer>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">joe</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData NotOnOrAfter="2011-06-21T18:50:05.619Z" Recipient="<http_protocol>s://sp:9031/sp/ACS.saml2"/>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:Conditions NotOnOrAfter="2011-06-21T18:50:05.619Z" NotBefore="2011-06-21T18:40:05.619Z">
<saml:AudienceRestriction>
<saml:Audience>sp:cloud:saml2</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="2011-06-21T18:45:05.604Z" SessionIndex="IbDavCE__pPV99SnSP5aFX8ZVtZ">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
</saml:Assertion>
</Response>
SP init SSO 与上面非常类似， 除了SP 要发出Authen Request外， SP还要负责维护RelayState，而不是由IDP 来指定。 
SAML 可以建立在SOAP上传输，也可以建立在其他协议上传输。 
正如样本中提到的， SAML的规范由几个部分构成：SAML Assertion，SAML Prototol，SAML binding等。
安全
由于SAML在两个拥有共享用户的站点间建立了信任关系，所以安全性是需考虑的一个非常重要的因素。SAML中的安全弱点可能危及用户在目标站点的个人信息。SAML依靠一批制定完善的安全标准，包括SSL和X.509，来保护SAML源站点和目标站点之间通信的安全。源站点和目标站点之间的所有通信都经过了加密。为确保参与SAML交互的双方站点都能验证对方的身份，还使用了证书。
BEA WebLogic Server中的SAML
BEA WebLogic Server 9.0是第一个包含了对SAML支持的WebLogic Server版本。WebLogic Server 9.1中进一步加强了对SAML的支持。WebLogic Server把SAML作为WebLogic Security Service的一部分使用。SAML用来为WebLogic Web services和跨WebLogic域共享验证信息提供SSO支持。除SAML外，WebLogic Server也为Windows桌面SSO支持Simple and Protected Negotiate (SPNEGO)协议。SAML可用来提供访问Web应用程序和Web service的权限。
对于一些应用程序，您仅需付出很少甚至无需付出额外的程序设计努力，就能使用WebLogic Server中的SAML支持。如果用户应用程序使用配置为WebLogic 安全域一部分的安全设置，那么集成SAML是一个首要的系统管理任务。WebLogic server可配置作为SAML源站点或SAML目标站点。要使服务器成为SAML源站点，需配置一个SAML Credential Mapper。要使服务器成为SAML目标站点，需配置一个SAML Identity Asserter.
如果用户应用程序安全模式为与WebLogic Security Service进行交互，包含了自己的特定于WebLogic的代码，可以使用WebLogic的SAML API把该定制扩展到SAML。该API提供对WebLogic SAML服务主要组件的编程式访问。用户可以使用应用程序自身的业务逻辑来扩展诸如SAMLCredentialNameMapper和 SAMLIdentityAssertionNameMapper这样的类。一旦用户有了自己的定制类，WebLogic管理控制台就允许用户配置其 SAML Credential Mapper（源站点）或SAML Identity Asserter（目标站点），以便使用那些类。惟一的要求是用户的定制类需要在系统类路径中，非常类似于WebLogic启动类，这可能对用户部署策略产生影响。
最后，如果应用程序安全模式完全独立于WebLogic Security Service，用户将不能从WebLogic的SAML工具中获益。用户要使其应用程序支持SAML就需要做更多工作，要么实现WebLogic所提供的某些服务的简化版本，要么集成那些服务的第三方版本。但是，用户仍将受益于可在任何J2EE应用服务器或在如Tomcat这样的Java Web服务器应用程序上使用SAML。有商业和开源的SAML支持可供选择。开源的选择中有OpenSAML和相关的Shibboleth项目。 OpenSAML是一个SAML工具包，可用来建立用户自己的SAML源站点和目标站点。Shibboleth更进一步，它提供了一个构建在 OpenSAML之上的“基于SAML 1.1的跨域Web单点登录平台”。SourceID为Java 和.NET中的SAML 1.1提供了一套开源工具包。在Apache项目下没有完整的SAML工具包，但WSS4J项目包含了对OpenSAML的一些支持。