saml断言
本教程系列的第4部分没有概述Salesforce联合单点登录(SSO)的基础。 本教程主要讨论如何使用由IBM®WebSphere DataPower(以下称为DataPower)作为身份提供者,由加密并签名的SAML声明提供支持,将服务提供者发起的SSO实施到Salesforce。 图1和图2展示了该解决方案的高层概述。
图1.服务提供商启动的SSO登录到Salesforce的概述
图2.服务提供商启动的SSO登录流程
Force.com平台上的单点登录设置
本节提供了为Force.com平台实施单点登录设置的步骤。 如果您已经实现了本系列中的任何教程所说明的示例,则可能无需再次重复相同的步骤。 但是,请确保已配置此示例所需的其他设置。
步骤1:创建Salesforce用户帐户
首先,如果您尚未创建一个用户帐户(Salesforce管理员),则在Salesforce开发人员站点上 。 图3显示了Salesforce用户(开发人员版)的注册过程。
图3.在Salesforce开发人员站点上创建的Salesforce用户帐户(Developer Edition)
通过输入在注册过程中获得的凭据登录到Salesforce,并创建另一个用户帐户。 确保输入如图4所示的联合身份验证ID,以启用该用户帐户的SSO登录。
用户ID: sdfc.user@sdfc.com
联盟ID: sdfc.user@sso.sdfc.com
图4.输入联盟ID以启用SSO
图5显示了一个Salesforce用户详细信息页面。 本教程系列说明的示例使用以下示例用户帐户进行SSO设置。 我们强烈建议您不要启用您的组织的Salesforce管理员SSO功能,因为身份提供者(DataPower的)应用程序的任何中断将阻止所有管理有关的活动。
图5. Salesforce上的示例用户帐户详细信息
步骤2:创建自签名或CA签名的证书
证书用于与外部身份提供商进行经过身份验证的单点登录。 您需要服务提供商发起的SSO的Salesforce证书,才能在Force.com端对SAML身份验证请求进行签名,并在身份提供商侧验证相同的签名。 在此示例中,身份提供者还使用Salesforce证书对SAML断言响应进行加密。 创建证书后,将其下载并保存到本地系统中。 本教程系列说明的示例使用以下自签名证书(标签: Salesforce SSO ),如图6和图7所示。
图6. Salesforce上的自签名证书列表
图7.证书(标签:Salesforce SSO)详细信息页面
步骤3:管理Salesforce网域
使用“ 我的域” (图8),可以定义自定义Salesforce域名。 此名称可以通过多种方式帮助您更好地管理组织的登录和身份验证。 有关域管理的详细信息,请参阅Salesforce文档。 本教程系列说明的示例使用以下域名。 我们建议您为组织使用合适的域名。 示例域名的示例是https://dipak-sdfc-dev-ed.my.salesforce.com/
。
图8. Salesforce上的“我的域”概述
步骤4:在Salesforce上设置SSO设置
- 以Salesforce管理员身份登录,然后转到设置>安全控制>单一登录设置 。 确保在“使用SAML的联合单一登录”选项卡中选中了“ 启用SAML”复选框,然后单击“ SAML单一登录设置”选项卡中的“ 新建”按钮。 图9和图10显示了此示例使用的Salesforce SSO设置。 在Force.com平台上进行此SSO设置之前,请确保您已经创建了DataPower加密密钥和相关证书,如步骤6所述 。
图9. Salesforce上的SAML SSO设置
图10. SAML SSO设置细节
- 将DataPower证书上载为身份提供者证书 ,以便Force.com平台可以验证与SAML断言响应关联的签名。
- 将在步骤2中生成的自签名或CA签名证书用于“ 签名证书”和“ 断言解密证书”字段。 在颁发者和实体ID字段中输入适当的值。 在身份提供者登录URL字段中使用DataPower SSO登录URL(例如
https://<host:port>/sso/salesforce/saml/request
),以便Force.com可以将请求重定向到身份提供者的SSO登录网址。 本教程中使用的SAML声明已加密,并且在Subject语句的NameIdentifier( NameID )字段中包含登录用户的联盟ID 。 - 保存SAML SSO设置后,记下Salesforce登录URL(例如,
https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC&sc=0LEF0000000Kytb
。
步骤5:更新“我的域”中的登录页面品牌
转到“ 设置”>“域管理”>“我的域” ,编辑“ 登录页面品牌” ,然后检查适当的身份验证服务 。 此登录页面品牌设置在域特定的登录页面上显示SSO登录选项,如图11和图12所示。
图11.我的域中的登录页面品牌
图12.带有自定义SSO提供程序的特定于域的登录页面
将DataPower配置为单一登录身份提供者
本部分描述了开发必要的DataPower工件的步骤,这些工件主要由HTTPS前端处理程序和多协议网关组成,包括所需的处理策略和AAA策略。
步骤6:管理DataPower加密密钥
- 使用DataPower加密工具生成加密密钥和自签名(或CA签名)证书,这是安全HTTP(SSL)连接和签名生成所必需的(图13)。
- 创建DataPower证书后,请从
temporary://
目录下载该证书(图14)。 如果您已经实现了本教程系列中的任何示例,则可以重复使用相同的加密配置。 确保配置了加密验证凭证,其中包括在步骤2中下载的Salesforce证书。图13.本示例中使用的DataPower加密密钥
图14.此示例中使用的DataPower加密证书
- 创建一个加密证书并导入在第2步中下载的Salesforce证书,这是验证SAML身份验证请求中的签名和加密SAML断言响应所必需的(图15)。
图15.通过导入Salesforce证书配置加密证书
- 创建一个加密标识凭证,并添加SSL设置所需的DataPower加密密钥(图16)。
图16.配置加密标识凭证
- 创建一个加密验证凭证并添加Salesforce证书,如图17所示。如果您强制执行SSL客户端证书验证,则可能需要添加客户端(例如浏览器)证书。
图17.配置加密验证凭证
- 创建一个加密配置文件。 添加加密标识凭证和加密验证凭证(图18)。
图18.配置一个加密配置文件
- 使用反向 SSL方向创建一个SSL代理配置文件(图19),并使用在上一步中创建的加密配置文件。
图19.配置SSL代理配置文件
步骤7:创建HTTPS前端处理程序
创建一个HTTPS前端处理程序(图20)以接受来自浏览器的SSO请求。
图20.配置一个HTTPS前端处理程序
步骤8:创建多协议网关
创建具有动态后端路由的多协议网关(图21)。 还要确保为请求和响应数据类型选择“ 非XML ”以处理HTTP表单数据和HTML数据。 下一部分,步骤9,描述了多协议网关策略的详细信息。
图21.配置多协议网关
步骤9:创建多协议网关策略
使用以下处理规则创建一个多协议网关策略。
- 第一条规则:此规则处理来自浏览器的favicon.ico请求(图22)。
方向:客户端到服务器。
- 动作:比赛
匹配类型: URL
网址匹配:/favicon.ico
- 行动:高级[设置变量]
变量名称:var://service/mpgw/skip-backside
变量分配: 1 - 行动:结果
图22.处理来自浏览器的favicon.ico请求的多协议网关策略规则
- 动作:比赛
- 第二条规则:此规则处理来自服务提供商的SSO登录请求,这些请求使用HTTP POST绑定通过浏览器重定向。 该规则执行以下活动序列:
- 通过浏览器从服务提供商接收HTTP POST请求,该请求包含带有以下参数的HTTP表单数据。
- RelayState:这是用户请求从服务提供商进行访问的原始资源URI 。
- SAMLRequest:这是基于base-64编码的SAML身份验证请求。
- 解析HTTP表单数据并提取上述参数。
- 解码(base-64)SAML身份验证请求,并从
/AuthnRequest/@AssertionConsumerServiceURL
属性提取Salesforce登录URL。 - 验证从SAML身份验证请求XML中提取的签名。
- 使用AAA策略对SAML请求发布者进行身份验证(在本示例中为
https://dipak-sdfc-dev-ed.my.salesforce.com
)。 - 成功验证SAML请求发布者后,它将使用另一个AAA策略对用户进行身份验证,并生成SAML声明XML。
- 从< SubjectConfirmationData >元素中删除@NotBefore属性,因为Salesforce SAML断言验证器框架不允许该属性。
- 通过使用Salesforce证书对SAML声明进行加密。
- 签名SAML断言。
- 生成一个HTML页面。 有关详细信息,请参阅特定的“ 变换”操作。
- 回复浏览器。
规则配置的详细信息是:
方向:客户端到服务器(图23)。
图23.多协议网关策略规则,用于处理来自服务提供商的SSO登录请求
- 动作:比赛
匹配类型: URL
URL匹配:/sso/salesforce/saml/request
注意:根据组织的标准使用适当的URL。 - 行动:将查询参数转换为XML(高级行动)(图24)
图24.操作:将查询参数转换为XML
- 行动:变形(图25)
此操作将解码(base-64)SAML身份验证请求,并从
/AuthnRequest/@AssertionConsumerServiceURL
属性提取Salesforce登录URL。 清单1显示了用于此转换的XSLT。清单1. XSLT [process-saml-auth-request.xsl]
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <xsl:variable name="vRelayState" select="/*[local-name()='request']/*[local-name()='args']/*[local-name()='arg' and @*[local-name()='name' and normalize-space(.) = 'RelayState']]/text()"/> <dp:set-variable name="'var://context/saml/auth-request/RelayState'" value="$vRelayState"/> <xsl:variable name="vSAMLRequest" select="/*[local-name()='request']/*[local-name()='args']/*[local-name()='arg' and @*[local-name()='name' and normalize-space(.) = 'SAMLRequest']]/text()"/> <xsl:variable name="vSAMLRequestXML" select="dp:parse($vSAMLRequest,'base-64')"/> <dp:set-variable name="'var://context/saml/auth-request/sdfcLoginURL'" value="$vSAMLRequestXML/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='AuthnRequest']/@AssertionConsumerServiceURL"/> <xsl:copy-of select="$vSAMLRequestXML"/> </xsl:template> </xsl:stylesheet>
图25.操作:转换
- 行动:验证签名(图26)
此操作将验证来自SAML身份验证请求的签名。
图26.操作:验证
- 行动: AAA(图27)
创建AAA策略以对SAML身份验证请求颁发者进行身份验证。 有关AAA配置的详细信息,请参阅步骤10 。
图27.操作:AAA(SAML身份验证请求颁发者身份验证)
- 行动: AAA(图28)
创建另一个AAA策略以认证用户并生成SAML断言XML。 有关AAA配置的详细信息,请参阅步骤11 。
图28.操作:AAA(用户认证和SAML断言生成)
- 行动:变形(图29)
如清单2所示,使用提供的XSLT( remove-specific-attribute.xsl )从< SubjectConfirmationData >元素中删除@NotBefore属性,因为Salesforce SAML断言验证器框架不允许该属性。
图29.在转换操作中使用XSLT从SAML断言XML中删除一个属性
清单2. XSLT [remove-specific-attribute.xsl]从SAML断言XML中删除特定属性
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/> <xsl:strip-space elements="*"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Assertion']/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Subject']/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='SubjectConfirmation']/*[namespace-uri() ='urn:oasis:names:tc:SAML:2.0:assertion' and local-name() ='SubjectConfirmationData']/@NotBefore"/> </xsl:stylesheet>
- 行动:加密(图30)
此操作通过使用Salesforce证书对SAML声明进行加密。 创建一个指定以下XPATH的Document Crypto Map(清单3),如图31所示。
清单3.文档加密映射中使用的XPATH
/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Assertion']
图30.加密SAML断言
图31.创建用于加密的文档加密映射
- 行动:签名(图32)
此操作通过使用以下方式对加密的SAML声明XML(XPATH:/
/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']
:/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']
:/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']
:/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']
:SAML:/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']
:/*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']
)进行数字签名DataPower加密密钥和在步骤6中生成的证书。图32. Sign SAML断言XML
- 行动:变形(图33)
此操作将生成一个HTML页面,该页面包括带有HTTP POST操作HTML FORM,并包含以base-64编码的SAML断言XML和RelayState作为隐藏参数。 图33显示了成功认证后DataPower响应的示例HTML页面。 使用清单4中所示的XSLT( SSO-Generate-HTML-SP.xsl ),该教程也在“ 下载”部分中提供。
图33. XSLT转换以生成HTML响应
清单4. XSLT [SSO-Generate-HTML-SP.xsl]生成HTML页面
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions"> <xsl:output method="html" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:variable name="relayState" select="dp:variable('var://context/saml/auth-request/RelayState')"/> <xsl:variable name="sdfcLoginURL" select="dp:variable('var://context/saml/auth-request/sdfcLoginURL')"/> <xsl:variable name="signedSamlSerialized"> <dp:serialize select="/" omit-xml-decl="yes"/> </xsl:variable> <xsl:variable name="base64Samldata" select="dp:encode($signedSamlSerialized,'base-64')"/> <html> <head> <title>Login to Salesforce</title> <meta http-equiv="Cache-Control" content="no-cache"/> <meta http-equiv="Pragma" content="no-cache"/> <meta http-equiv="Expires" content="-1"/> <meta http-equiv="X-UA-Compatible" content="IE=8"/> <style type="text/css"> .body{background-color: #3EB1D0;} .data{ background-color: #C6EDEC; margin-top: 10%; margin-left: 20%; margin-right: 20%; font-family: verdana; color: #0A6DA8; } .headline{font-size: 50px;} .button{ background-color: #F5DAA3; color: #0D75AA; font-size: x-large; } </style> </head> <body class="body"> <div align="center" class="data"> <div> <form method="POST" enctype="application/x-www-form-urlencoded"> <xsl:attribute name="action"> <xsl:value-of select="$sdfcLoginURL"/> </xsl:attribute> <div class="headline"> <i><b>Salesforce Login</b></i> </div> <div><h2>Welcome<span><i><b> <xsl:value-of select="dp:variable('var://context/WSM/identity/username')"/></b></i> </span></h2></div> <div> <h4> <p>Clicking Submit button will redirect you to Salesforce home page</p> <p>Please contact <a href="mailto:support@example.com">support@example.com</a> if you experience any issues during Salesforce Login</p></h4> </div> <div> <input type="hidden" name="idpConfig.recipient"> <xsl:attribute name="value"> <xsl:value-of select="$sdfcLoginURL"/> </xsl:attribute> </input> <input type="hidden" name="SAMLResponse"> <xsl:attribute name="value"> <xsl:value-of select="$base64Samldata"/> </xsl:attribute> </input> <input type="hidden" name="RelayState"> <xsl:attribute name="value"> <input type="hidden" name="RelayState"> </xsl:attribute> </input> </div> <br/> <div> <input class="button" type="submit" name="submit" value="Login to Salesforce"/> </div> <br/> </form> </div> </div> </body> </html> </xsl:template> </xsl:stylesheet>
- 行动:高级[设置变量]跳过真实的后端路由(图34)。
变量名称:var://service/mpgw/skip-backside
变量分配: 1图34.跳过后端路由的高级操作
- 行动:结果(图35)
图35.结果操作
- 通过浏览器从服务提供商接收HTTP POST请求,该请求包含带有以下参数的HTTP表单数据。
步骤10:创建AAA策略以认证SAML请求发布者
此AAA策略从SAML身份验证请求中提取发行者作为自定义令牌,并针对清单5中所示的AAA Policy Info文件进行身份验证:
XPATH: /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='AuthnRequest']
/*[namespace-ri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Issuer']/text()
图36、37和38显示了AAA策略配置的详细信息。
清单5.示例AAA策略信息文件
<?xml version="1.0" encoding="utf-8"?>
<AAAInfo xmlns="http://www.datapower.com/AAAInfo">
<FormatVersion>1</FormatVersion>
<Filename>local:///AAAInfoPolicy.xml</Filename>
<Summary>AAA Policy Info XML file</Summary>
<Authenticate>
<Username>dipakpal</Username>
<Password>dipakpal-password</Password>
<OutputCredential>dipakpal@sso.sdfc.com</OutputCredential>
</Authenticate>
<Authenticate>
<Username>sdfc.user</Username>
<Password>sdfc-password</Password>
<OutputCredential>sdfc.user@sso.sdfc.com</OutputCredential>
</Authenticate>
<Authenticate>
<CustomToken>https://dipak-sdfc-dev-ed.my.salesforce.com</CustomToken>
<OutputCredential>saml.auth.request.issuer</OutputCredential>
</Authenticate>
<Authenticate>
<DN>CN=Alice, O=DataPower, L=Cambridge, ST=MA, C=US</DN>
<OutputCredential>admin</OutputCredential>
</Authenticate>
<Authenticate>
<IPHost>127.0.0.1</IPHost>
<OutputCredential>admin</OutputCredential>
</Authenticate>
<Authenticate>
<IPHost>::1</IPHost>
<OutputCredential>admin</OutputCredential>
</Authenticate>
<Authenticate>
<Username>guest</Username>
<Password>guest</Password>
<OutputCredential>user</OutputCredential>
</Authenticate>
<Authorize>
<InputCredential>dipakpal@saml.sdfc.com</InputCredential>
<InputResource>/sso/*</InputResource>
<Access>allow</Access>
</Authorize>
<Authorize>
<InputCredential>sdfc.user@sso.sdfc.com</InputCredential>
<InputResource>/sso/*</InputResource>
<Access>allow</Access>
</Authorize>
<Authorize>
<InputCredential>saml.auth.request.issuer</InputCredential>
<InputResource>/sso/*</InputResource>
<Access>allow</Access>
</Authorize>
<Authorize>
<InputCredential>guest</InputCredential>
<InputResource>/sso/salesforce</InputResource>
<Access>deny</Access>
</Authorize>
<Authorize>
<InputCredential>admin</InputCredential>
<InputResource>/sso/salesforce</InputResource>
<Access>allow</Access>
</Authorize>
<Authorize>
<InputCredential>
<Version>3</Version>
<SerialNumber>0</SerialNumber>
<SignatureAlgorithm>sha1WithRSAEncryption</SignatureAlgorithm>
<Issuer>C=US, ST=MA, L=Cambridge, O=DataPower, CN=Alice</Issuer>
<NotBefore>2002-11-23T01:15:33Z</NotBefore>
<NotAfter>2012-11-23T01:15:33Z</NotAfter>
<Subject>C=US, ST=MA, L=Cambridge, O=DataPower, CN=Alice</Subject>
<SubjectPublicKeyAlgorithm>rsaEncryption</SubjectPublicKeyAlgorithm>
<Extensions/>
</InputCredential>
<InputResource>/sso/*</InputResource>
<Access>allow</Access>
</Authorize>
</AAAInfo>
图36. AAA:从SAML身份验证请求XML中提取定制令牌
图37. AAA:根据AAA策略Info XML对SAML认证请求发布者进行认证
图38. AAA:授权任何经过身份验证的客户端
步骤11:创建AAA策略以认证用户
- 创建另一个AAA策略以认证用户并生成SAML断言XML。 本教程说明的示例使用基本的HTTP身份验证方法,并根据清单5中所示的DataPower AAA策略信息XML验证用户凭据。 但是,您可以根据组织的标准实施适当的身份验证方法。 AAA策略配置详细信息如图39至41所示。 如果您已经实现了本系列以前的教程中说明的任何示例,则可以重用相同的AAA策略。
图39. AAA策略–从请求中提取身份
图40. AAA策略–验证用户
图41. AAA策略–授权请求
- 配置此AAA访问控制策略,以在身份验证成功后生成SAML声明响应。 图42显示了启用SAML声明的AAA访问控制策略页面。 确保使用在Salesforce SSO设置( 步骤4 )上配置的同一SAML 发行者 (例如,
https://datapowersso.ibm.com/
//datapowersso.ibm.com/)。图42. AAA策略–生成SAML断言响应
- 在AAA Access Control Policy页面的SAML Audience字段中,从Salesforce SSO设置( 步骤4 )设置Entity ID值。
- 将Salesforce登录URL用于SAML收件人和响应目标字段。
- 创建SAML属性定义,如图43所示。
图43. AAA策略– SAML属性
步骤12:测试单点登录
- 在Web浏览器中输入特定于域的服务提供商(例如Salesforce)资源URL或登录URL,如图44所示。该示例使用以下带书签的URL,该URL显示Force.com上的用户列表:
https://dipak-sdfc-dev-ed.my.salesforce.com/005?retURL=%2Fui%2Fsetup%2FSetup%3Fsetupid%3DUsers &setupid=ManageUsers
图44. Salesforce登录页面(特定于域)
- 确保Salesforce资源或登录URL是特定于域的。 单击登录页面上的适当的SSO身份提供程序(此示例为DataPower SSO )选项将请求(HTTP POST)重定向到DataPower。 DataPower验证SAML身份验证请求,然后如果用户尚未登录,则向用户询问登录凭据(图45)。
图45. DataPower向用户挑战登录凭证
- 认证成功后,DataPower将以SSO重定向(HTTP POST绑定)页面作为响应,如图46所示,该页面包括带有HTTP POST操作HTML FORM,并包含以base-64编码的SAML断言XML和RelayState作为隐藏参数。 。 它要求用户通过单击“ 登录到Salesforce”按钮来提交HTML页面,从而导致向Salesforce登录URL提交HTTP POST请求(例如,
https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghL&sc=0LEF0000000Kytb
)。图46.成功认证后的SSO重定向(HTTP POST绑定)页面
- Salesforce使用SAML断言XML中的嵌入式签名针对DataPower证书来验证消息的完整性,该证书已在SSO设置过程中上载。 成功进行签名验证后,它将解密加密的断言,处理SAML断言语句,提取并验证联合ID,最后重定向到最初请求的页面。 图47显示了此示例在成功进行SSO登录之后的Salesforce登陆页面。
图47.成功登录SSO后的“请求的资源”页面
第13步:调试和疑难解答指南
假设您熟悉DataPower的常见调试和故障排除方法,那么本教程将主要侧重于Salesforce。
您可以使用Google Chrome中的 Developer Tools捕获base-64编码的SAML身份验证请求,如图48和图49所示。尽管您可以从HTML页面源获取此数据,但使用Developer Tools或Internet Explorer可以帮助您分析HTTP事件,包括其请求/响应标头和数据结构。 您可以使用任何联机工具(例如, http://www.string-functions.com/base64decode.aspx
)对此数据进行解码(基于64),以获取SAML身份验证请求XML。 清单6显示了一个示例SAML身份验证请求XML。
图48.在谷歌浏览器中启动开发人员工具
图49.开发人员工具显示的DataPower SSO登录请求的HTTP表单数据
清单6.签名的SAML身份验证请求示例
<samlp:AuthnRequest
AssertionConsumerServiceURL=">https://dipak-sdfc-dev-ed.my.salesforce.com?
so=00DF0000000ghL&sc=0LEF0000000Kytb"
Destination="https://100.99.99.99:80/sso/salesforce/saml/request"
ID="_2_qtBx5CYOfeRPm783dL0kCopCzgOGJIGFCfNYWjZc_cKcRnB_jktE1lwIyXMSmnn8Phcmpv8e_xVZel9S
Q_AoHf.ebf1pLAmMX4Wij1MFrVUtsMoHdBy2KwJFtuFFKG87GTQTUogXIw5AS5Q9Nx0esc8vg.Nzxp.sQ0a24rHa
XK0i7KC3LUamo.zqwP.2VTYgPp.kI_jZFpSg1q7Oo2pwwC_xwKpoA"
IssueInstant="2014-07-28T04:32:35.342Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
https://dipak-sdfc-dev-ed.my.salesforce.com</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference
URI="#_2_qtBx5CYOfeRPm783dL0kCopCzgOGJIGFCfNYWjZc_cKcRnB_jktE1lwIyXMSmnn8Phcmpv8e_xVZel
9SQ_AoHf.ebf1pLAmMX4Wij1MFrVUtsMoHdBy2KwJFtuFFKG87GTQTUogXIw5AS5Q9Nx0esc8vg.Nzxp.sQ0a24r
HaXK0i7KC3LUamo.zqwP.2VTYgPp.kI_jZFpSg1q7Oo2pwwC_xwKpoA">
<ds:Transforms>
<ds:Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14#">
<ec:InclusiveNamespaces PrefixList="ds saml samlp"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="e>http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>vPFOzywPaMuL2RR5A6kn2yMn1b0=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>SXKNfCiYk6lzqrJNaeBLp0bT3FhI/iUvGFr9u+ncqmTm+0UyXo0t3qqHbENk+pN
qXNIrwDFMP4NQJssHVfrEJt0k0XJ0Tr............................</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIEcjCCA1qgAwIBAgIOAUdWZRxHAAAAABAQi70wDQYJKoZIhvcNAQEF
BQAwfjEWMBQGA1UEAwwN...............................</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</samlp:AuthnRequest>
您可以使用Google Chrome中的Developer Tools捕获base64编码的SAML声明响应数据,如图50所示。清单7显示了一个示例SAML声明XML。
图50.从HTML页面源捕获base-64编码的SAML断言XML
清单7.样本的经过加密和签名的SAML认证响应
<samlp2:Response Version="2.0" ID="SAML-55173ac1-93ab-4a69-a7f9-cbf85b0de345"
IssueInstant="2014-07-28T04:31:35Z"
InResponseTo="_2_qtBx5CYOfeRPm783dL0kCopCzgOGJIGFCfNYWjZc_cKcRnB_jktE1lwIyXMSmnn8Phcmpv
8e_xVZel9SQ_AoHf.ebf1pLAmMX4Wij1MFrVUtsMoHdBy2KwJFtuFFKG87GTQTUogXIw5AS5Q9Nx0esc8vg.Nzxp
.sQ0a24rHaXK0i7KC3LUamo.zqwP.2VTYgPp.kI_jZFpSg1q7Oo2pwwC_xwKpoA"
Destination="https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC"
xmlns:samlp2="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
https://datapowersso.ibm.com/</saml2:Issuer>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#SAML-55173ac1-93ab-4a69-a7f9-cbf85b0de345">
<Transforms>
<Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>W145ngU06DdGMAguqb6erN1WUcY=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>PC/ivOJSUdzK+3ErExxcO7Ukd5eP3Yzf14o5b/wiEGEKs2Vqz7pfzxukMWJPWcFKbG
Br+il/kcGaqgzznAH50qWi7LtjR9YT.................................</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIDtzCCAp+gAwIBAgIIAhBEWantyAswDQYJKoZIhvcNAQEFBQAwQjELMAk
GA1UEBhMCVVMxDDAKBgNVBAoTA0lCTTEMMAoGA1UECxMDR0JTMRcwFQYDVQQDEw5EQVRBUE9XRVItU0RGQzAeFw0
xNDA3MjEwMDA1NTNaFw0xNTA3MjEwM....................................</X509Certificate>
<X509IssuerSerial>
<X509IssuerName>CN=DATAPOWER-SDFC, OU=GBS, O=IBM, C=US</X509IssuerName>
<X509SerialNumber>148693939596937227</X509SerialNumber>
</X509IssuerSerial>
</X509Data>
</KeyInfo>
</Signature>
<samlp2:Status>
<samlp2:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp2:Status>
<saml2:EncryptedAssertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<xenc:EncryptedKey Recipient="name:Salesforce-SSO-Cert">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
<dsig:KeyInfo>
<dsig:KeyName>Salesforce-SSO-Cert</dsig:KeyName>
</dsig:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>R+UanpDRYXazpVo4HgpUzK9/oZ2lzZvXM3gxvqhaoxE1zkuj1jU9
QKHScGbqcCc/loFM+0ga98oTx1TvRuA1...........................</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</dsig:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>+nnVWq3htwLPxTcHWMCUi0Y0J0AyGIyh2qJxYtm1WpEUJS/OmbrBfyW/jd
tQbl8s8zRQk1Ns8NZWLzbmqBRU/NeDCqNDtejWPs8BM9EDGr4JKVA/nEWwggnyXu1/C7De42Tg/RQS6Y9w3Emuju
QcsHLmCFuFeLRDnK5/rtJAvCA5J............................</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</saml2:EncryptedAssertion>
</samlp2:Response>
以管理员身份登录到Salesforce,并验证base-64编码的SAML声明,以检查SSO身份提供程序(DataPower)是否生成了Salesforce期望的正确SAML声明。 图51至54显示了使用Force.com SAML断言验证器框架进行的SAML断言验证。
图51.在Salesforce上启动SAML断言验证器框架
图52.将base-64编码的SAML断言输入到Salesforce SAML Validator中
图53.在Salesforce SAML验证器上成功的SAML断言验证
图54.带有过期时间戳记的无效SAML断言
在测试SSO登录名时,您可以以Salesforce管理员的身份从单独的登录名监视Force.com上的登录历史记录。 图55显示了Force.com站点上的登录历史记录页面,该页面可以帮助您解决SSO登录失败。
图55. Force.com上的登录历史记录页面
结论
Salesforce用户较少的组织可能不需要单一登录解决方案,因为他们可以继续使用Salesforce标准登录过程。 但是,拥有大量Salesforce用户的组织可以通过为其所有内部应用程序以及基于云的外部应用程序(例如Force.com)实施基于DataPower的单点登录基础结构来利用此解决方案,这些支持使用外部SSO身份提供商的联合身份管理。
本教程(第4部分)总结了有关使用WebSphere DataPower实现Salesforce联合单点登录的系列教程 。
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1505_pal4/1505_pal4.html
saml断言