sso saml_使用签名的SAML断言实现服务提供商发起的SSO

sso saml

本教程系列的第3部分重点介绍了使用IBM®WebSphere DataPower(以下称为DataPower)作为身份提供者,并通过签名的SAML断言来实现对Salesforce的服务提供者发起的单点登录(SSO)。 图1和图2代表了该解决方案的高层概述。 本教程没有概述第1部分中已经介绍过的Salesforce联合SSO的基础知识。

图1.服务提供商启动的SSO登录到Salesforce的概述
服务提供商启动的SSO登录到Salesforce的概述
图2.服务提供商启动的SSO登录流程
服务提供商启动的SSO登录流程

Force.com平台上的单点登录设置

本节提供了在Force.com平台上实施SSO设置的步骤。 如果您已经实现了本系列任何教程中的示例,则可能无需再次重复相同的步骤。 但是,请确保已配置此示例所需的其他设置。

步骤1:创建Salesforce用户帐户

首先,从Salesforce开发人员站点创建一个用户帐户(Salesforce管理员)(如果您还没有的话)。 图3显示了Salesforce用户(开发人员版)的注册过程。

图3.在Salesforce开发人员站点上创建的Salesforce用户帐户(Developer Edition)
在Salesforce开发人员站点上创建Salesforce用户帐户(Developer Edition)

本教程系列说明的示例使用以下示例用户帐户进行SSO设置。 我们强烈建议您不要启用您的组织的Salesforce管理员SSO功能,因为身份提供者(DataPower的)应用程序的任何中断将阻止所有管理有关的活动。

用户ID: sdfc.user@sdfc.com
联盟ID: sdfc.user@sso.sdfc.com

图4.输入联盟ID以启用SSO
输入联盟ID以启用SSO
图5. Salesforce上的示例用户帐户详细信息
Salesforce上的示例用户帐户详细信息

步骤2:创建自签名或CA签名的证书

证书用于与外部身份提供者进行身份验证的SSO。 您需要服务提供商发起的SSO的Salesforce证书,才能在Force.com端对SAML身份验证请求进行签名,并在身份提供商侧验证相同的签名。 创建证书后,将其下载并保存到本地系统中。 本教程系列说明的示例使用以下自签名证书(标签: Salesforce SSO ),如图6和图7所示。

图6. Salesforce上的自签名证书列表
Salesforce上的自签名证书列表
图7.证书(标签:Salesforce SSO)详细信息页面
证书(标签:Salesforce SSO)详细信息页面

步骤3:管理Salesforce网域

使用“ 我的域” (图8),可以定义自定义Salesforce域名。 此名称可以通过多种方式帮助您更好地管理组织的登录和身份验证。 有关域管理的详细信息,请参阅Salesforce文档 。 本教程系列说明的示例使用以下域名。 我们建议您为组织使用合适的域名。 示例域名的示例是https://dipak-sdfc-dev-ed.my.salesforce.com/

图8. Salesforce上的“我的域”概述
我在Salesforce上的域概述

步骤4:在Salesforce上设置SSO设置

  1. 以Salesforce管理员身份登录,然后转到设置>安全控制>单一登录设置 。 确保在“使用SAML联合单一登录”选项卡中选中了“ 启用S​​AML”复选框,然后单击“ SAML单一登录设置”选项卡中的“ 新建”按钮。 图9和图10显示了此示例使用的Salesforce SSO设置。 在Force.com平台上进行此SSO设置之前,请确保您已经创建了DataPower加密密钥和相关证书,如步骤6所述
    图9. Salesforce上的SAML SSO设置
    Salesforce上的SAML SSO设置
    图10. SAML SSO设置细节
    SAML SSO设置详细信息
  2. 将DataPower证书上载为身份提供者证书 ,以便Force.com平台可以验证与SAML断言响应关联的签名。
  3. 步骤2中生成的自签名或CA签名证书用作“ 签名证书” 。 在颁发者实体ID字段中输入适当的值。 在身份提供者登录URL字段中使用DataPower SSO登录URL(例如https://< dp-host:port >/sso/salesforce/saml/request ),以便Force.com可以将请求重定向到身份提供者的SSO登录网址。 本教程中使用的SAML声明未加密,并且在Subject语句的NameIdentifier( NameID )字段中包含登录用户的联盟ID
  4. 保存SAML SSO设置后,记下Salesforce登录URL,例如https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC ,如上面的图9和图10所示。

步骤5:更新“我的域”中的登录页面品牌

转到设置>域管理>我的域 ,编辑登录页面品牌,然后检查适当的身份验证服务 。 此登录页面品牌设置将确保在特定于域的登录页面上显示SSO登录选项,如图11和图12所示。

图11.我的域中的登录页面品牌
我的域中的登录页面品牌
图12.带有自定义SSO提供程序的特定于域的登录页面
具有自定义SSO提供程序的特定于域的登录页面

将DataPower配置为单一登录身份提供者

本节描述了开发必要的DataPower工件的步骤,这些工件主要由HTTPS前端处理程序和多协议网关组成,包括所需的处理策略规则和AAA策略。

步骤6:管理DataPower加密密钥

  1. 使用DataPower加密工具生成加密密钥和自签名(或CA签名)证书,这是安全HTTP(SSL)连接和签名生成所必需的(请参见图13)。
  2. 创建DataPower证书后,请从temporary://目录下载该证书(图14)。 如果您已经实现了本教程系列中的任何示例,则可以重复使用相同的加密配置。 确保配置了加密验证凭证,其中包括在步骤2中下载的Salesforce证书。
    图13.本示例中使用的DataPower加密密钥
    本示例中使用的DataPower加密密钥
    图14.此示例中使用的DataPower加密证书
    本示例中使用的DataPower加密证书
  3. 创建一个加密证书并导入在步骤2中下载的Salesforce证书,此示例对于验证SAML身份验证请求中的签名是必需的(图15)。
    图15.通过导入Salesforce证书配置加密证书
    通过导入Salesforce证书配置加密证书
  4. 创建一个加密标识凭证,并添加DataPower加密密钥(图16),这是SSL设置所必需的。
    图16.配置加密标识凭证,添加DataPower加密密钥
    配置加密标识凭证并添加DataPower加密密钥
  5. 创建一个加密验证凭据并添加Salesforce证书,如图17所示。如果您强制执行SSL客户端证书验证,则可能需要添加客户端证书,例如浏览器。
    图17.配置加密验证凭证
    配置加密验证凭证
  6. 创建一个加密配置文件。 添加加密标识凭证和加密验证凭证(图18)。
    图18.配置加密配置文件
    配置加密配置文件
  7. 使用反向SSL方向创建一个SSL代理配置文件(图19),并使用在上一步中创建的加密配置文件。
    图19.配置SSL代理配置文件
    配置SSL代理配置文件

步骤7:创建HTTPS前端处理程序

创建一个HTTPS前端处理程序以接受来自浏览器的SSO请求(图20)。

图20.配置一个HTTPS前端处理程序
配置HTTPS前端处理程序

步骤8:创建多协议网关

创建具有动态后端路由的多协议网关(图21)。 还要确保为请求和响应数据类型选择“ 非XML ”以处理HTTP表单数据和HTML数据。 下一部分,步骤9,描述了多协议网关策略的详细信息。

图21.配置多协议网关
配置多协议网关

步骤9:创建多协议网关策略

使用以下处理规则创建一个多协议网关策略。

  • 第一条规则:此规则处理来自浏览器的favicon.ico请求(图22)。

    方向:客户端到服务器。

    1. 动作:比赛
      匹配类型: URL
      网址匹配: /favicon.ico
    2. 行动:高级[设置变量]
      变量名称: var://service/mpgw/skip-backside
      变量分配: 1
    3. 行动:结果
      图22.处理来自浏览器的favicon.ico请求的多协议网关策略规则
      多协议网关策略规则,用于处理来自浏览器的favicon.ico请求
  • 第二条规则:此规则处理来自服务提供商的SSO登录请求,这些请求通过浏览器使用HTTP POST绑定进行重定向。 该规则执行以下活动序列:
    1. 通过浏览器从服务提供商接收HTTP POST请求,该请求包含带有以下参数的HTTP表单数据:
      • RelayState:这是用户请求从服务提供商进行访问的原始资源URI
      • SAMLRequest:这是基于base-64编码的SAML身份验证请求。
    2. 解析HTTP表单数据并提取上述参数。
    3. 解码(base-64)SAML身份验证请求,并从/AuthnRequest/@AssertionConsumerServiceURL属性提取Salesforce登录URL。
    4. 验证从SAML身份验证请求XML中提取的签名。
    5. 使用AAA策略对SAML请求颁发者 (在此示例中为https://dipak-sdfc-dev-ed.my.salesforce.com )进行身份验证。
    6. 在SAML要求发行人的成功认证,它通过使用其他AAA策略对用户进行认证,并生成一个SAML断言XML。
    7. 从< SubjectConfirmationData >元素中删除@NotBefore属性,因为Salesforce SAML断言验证器框架不允许该属性。
    8. 签名SAML断言。
    9. 生成一个HTML页面。 有关详细信息,请参阅特定的“ 转换 操作”
    10. 回复浏览器。
  • 规则配置详细信息

    方向:客户端到服务器(图23)。

    图23.多协议网关策略规则,用于处理来自服务提供商的SSO登录请求
    多协议网关策略规则,用于处理来自服务提供商的SSO登录请求
  1. 动作:比赛
    匹配类型: URL
    URL匹配: /sso/salesforce/saml/request 注意 :根据组织的标准使用适当的URL。
  2. 行动:将查询参数转换为XML(高级行动)–参见图24
    图24.操作:将查询参数转换为XML
    行动:将查询参数转换为XML
  3. 行动:转变

    此操作将解码(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.操作:转换
    行动:转变
  4. 行动:验证签名。

    该操作将验证来自SAML身份验证请求的签名(图26)。

    图26.操作:验证
    行动:验证
  5. 行动: AAA。 创建一个AAA策略来对SAML身份验证请求Issuer进行身份验证(图27)。 有关AAA配置的详细信息,请参阅步骤10
    图27.操作:AAA(用于SAML身份验证请求颁发者身份验证)
    行动:AAA(用于SAML身份验证请求颁发者身份验证)
  6. 行动: AAA。

    创建另一个AAA策略以认证用户并生成SAML断言XML(图28)。 有关AAA配置的详细信息,请参阅步骤11

    图28.操作:AAA(用于用户认证和SAML断言生成)
    行动:AAA(用于用户身份验证和SAML断言生成)
  7. 行动:转变。

    使用本教程的下载部分中提供的XSLT( remove-specific-attribute.xsl )从< SubjectConfirmationData >元素中删除@NotBefore属性,因为Salesforce SAML断言验证器框架不允许该属性(图29)。

    图29.在转换操作中使用XSLT从SAML断言XML中删除一个属性
    在转换操作中使用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>
  8. 行动:签署。

    如图30所示,此操作对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'] )通过使用在步骤6中生成的DataPower加密密钥和证书。

    图30. Sign SAML断言XML
    签名SAML断言XML
  9. 行动:转变。

    Transform Action生成一个HTML页面,该页面包括带有HTTP POST ActionHTML FORM,并包含以base-64编码的SAML断言XML和RelayState作为隐藏参数。 图31显示了成功认证后DataPower响应的示例HTML页面。 使用清单3中所示的XSLT( SSO-Generate-HTML-SP.xsl ),本教程的“ 下载”部分中也提供了XSLT。

    图31. XSLT转换以生成HTML响应
    XSLT转换以生成HTML响应
    清单3. 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>
  10. 行动:高级[设置变量]跳过真实的后端路由(图32)。
    变量名称: var://service/mpgw/skip-backside
    变量分配: 1
    图32.高级操作以跳过后端路由
    高级操作以跳过后端路由
  11. 行动:结果(图33)
    图33.结果操作
    结果动作

步骤10:创建AAA策略以认证SAML请求发出者

此AAA策略从SAML身份验证请求中提取颁发者作为自定义令牌:

{XPATH: /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='AuthnRequest']
 /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Issuer']/text()}

它针对清单4中所示的AAA策略信息文件进行身份验证。图34至36显示了AAA策略配置的详细信息。

清单4.示例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>
图34. AAA:从SAML身份验证请求XML提取定制令牌
AAA:从SAML身份验证请求XML中提取自定义令牌
图35. AAA:根据AAA Policy Info XML对SAML身份验证请求颁发者进行身份验证
AAA:根据AAA策略信息XML对SAML身份验证请求颁发者进行身份验证
图36. AAA:授权任何经过身份验证的客户端
AAA:授权任何经过身份验证的客户端

步骤11:创建AAA策略以认证用户

  1. 创建AAA策略以认证用户并生成SAML断言XML。 本教程说明的示例使用HTTP基本身份验证方法,并针对清单4中所示的DataPower AAA策略信息XML验证用户凭据。但是,您可以根据组织的标准实施适当的身份验证方法。 图37、38和39显示了AAA策略配置的详细信息。 如果您已经实现了本系列以前的教程中说明的任何示例,则可以重用相同的AAA策略。
    图37. AAA策略–从请求中提取身份
    AAA策略–从请求中提取身份
    图38. AAA策略–验证用户
    AAA策略–验证用户
    图39. AAA策略–授权请求
    AAA政策–授权请求
  2. 配置此AAA访问控制策略,以在身份验证成功后生成SAML声明响应。 图40显示了启用SAML声明的AAA访问控制策略页面。 确保使用在Salesforce SSO设置中配置的同一SAML颁发者(例如https://datapowersso.ibm.com/ )( 步骤4 )。
    图40. AAA策略–生成SAML断言响应
    AAA策略–生成SAML断言响应
  3. AAA Access Control Policy页面的SAML Audience字段中,从Salesforce SSO设置( 步骤4 )设置Entity ID值。 将Salesforce登录URL用于SAML收件人响应目标字段。 创建SAML属性定义,如图41所示。
    图41. AAA策略– SAML属性
    AAA策略– SAML属性

步骤12:测试单点登录

  1. 在Web浏览器中输入特定于域的服务提供商,例如Salesforce,资源URL或登录URL,如图42所示。本示例使用带有书签的URL,该URL显示Force.com上的用户列表。 例如:
    https://dipak-sdfc-dev-ed.my.salesforce.com/005?retURL=%2Fui%2Fsetup%2FSetup%3Fsetupid%3DUsers
     &setupid=ManageUsers)
    图42. Salesforce登录页面(特定于域)
    Salesforce登录页面(特定于域)
  2. 确保Salesforce资源或登录URL是特定于域的。 单击登录页面上的适当的SSO身份提供程序选项(此示例为DataPower SSO)将请求(HTTP POST)重定向到DataPower。 DataPower验证SAML身份验证请求,然后如果用户尚未登录,则向用户询问登录凭据(图43)。
    图43. DataPower向用户挑战登录凭证
    DataPower向用户挑战登录凭据
  3. 认证成功后,DataPower将以SSO重定向(HTTP POST绑定)页面作为响应,如图44所示,该页面包括带有HTTP POST ActionHTML FORM,并包含以base-64编码的SAML断言XML和RelayState作为隐藏参数。 它要求用户通过单击“ 登录到Salesforce”按钮来提交HTML页面,从而导致向Salesforce登录URL提交HTTP POST请求(例如, https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC )。
    图44.成功认证后的SSO重定向(HTTP POST绑定)页面
    成功认证后的SSO重定向(HTTP POST绑定)页面
  4. Salesforce使用SAML断言XML中的嵌入式签名针对DataPower证书来验证消息的完整性,该证书已在SSO设置过程中上载。 成功进行签名验证后,它将处理SAML声明语句,提取并验证联合身份验证ID,最后重定向到最初请求的页面。 图45显示了此示例成功尝试SSO登录后的Salesforce登录页面。
    图45.成功登录SSO后的“请求的资源”页面
    成功登录SSO后请求的资源页面

第13步:调试和疑难解答指南

假设您熟悉DataPower的常见调试和故障排除方法,那么本教程将主要侧重于Salesforce。

您可以使用Google Chrome中的 开发人员工具捕获基于base-64编码的SAML身份验证请求,如图46和图47所示。尽管您可以从HTML页面源获取此数据,但是可以使用Google Chrome或Internet Explorer的 开发人员工具来分析HTTP事件,包括它们的请求/响应标头和数据结构。 您可以使用任何在线工具(例如http://www.string-functions.com/base64decode.aspx )解码(base-64)此数据,以获取SAML身份验证请求XML。 清单5显示了一个示例SAML身份验证请求XML。 清单6显示了一个示例SAML身份验证响应。

图46.在Google Chrome上启动开发人员工具
在Google Chrome浏览器中启动开发人员工具
图47.开发人员工具显示的DataPower SSO登录请求的HTTP表单数据
开发人员工具显示的DataPower SSO登录请求的HTTP表单数据
清单5.已签名的SAML身份验证请求的示例
<samlp:AuthnRequest
 AssertionConsumerServiceURL="https://dipak-sdfc-dev-ed.my.salesforce.com?
so=00DF0000000ghLC"
 Destination="https://100.99.99.99:80/sso/salesforce/saml/request"
 ID="_2RWCvoeG0FNhRmMRwdlJnZzhVKmgME5u1MUEJJgquj_5CpqN_8xvDmQxUF.fdnfU_8wBHMVwnAYHvOfS0S
h25dCPo5GJhnTEMLCD6GPDPba0UhS2luq0QFCqQWDSQrVI4A4XnK5lfntptA2mJMX1687Oi1bDugUZF9KxRMluff
vhfZber6LQX4enqbtqN2OqngPp.kI_jZFpSg1q7Oo2pwwC_btWiIA"
 IssueInstant="2014-07-28T03:36:23.875Z"
 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="#_2RWCvoeG0FNhRmMRwdlJnZzhVKmgME5u1MUEJJgquj_5CpqN_8xvDmQxUF.fdnfU_8wBHMVwnAYHvOfS
0Sh25dCPo5GJhnTEMLCD6GPDPba0UhS2luq0QFCqQWDSQrVI4A4XnK5lfntptA2mJMX1687Oi1bDugUZF9KxRMlu
ffvhfZber6LQX4enqbtqN2OqngPp.kI_jZFpSg1q7Oo2pwwC_btWiIA">
 <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-c14n#">
 <ec:InclusiveNamespaces PrefixList="ds saml samlp"
 xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
 </ds:Transform>
 </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
 <ds:DigestValue>jR2TgfzwxiM4Ie1sUOEFaOBZvyw=</ds:DigestValue>
 </ds:Reference>
 </ds:SignedInfo>
 <ds:SignatureValue>gbd1PtArCK+nI0+n6QNTnQJr44sP30LwFXSimLPSnRUahQgfpkU91IWo/ShUiQo
oaV5MTG/LBn/MYpm8AOIOZsMI87yN7Br8ZLTpe6dNn..........................</ds:SignatureValue>
 <ds:KeyInfo>
 <ds:X509Data>
 <ds:X509Certificate>MIIEcjCCA1qgAwIBAgIOAUdWZRxHAAAAABAQi70wDQYJKoZIhvcNAQEF
BQAwfjEWMBQGA1UEAwwNU2FsZXNmb3JjZV.............................</ds:X509Certificate>
 </ds:X509Data>
 </ds:KeyInfo>
 </ds:Signature>
</samlp:AuthnRequest>
图48.从HTML页面源捕获base-64编码的SAML断言XML
从HTML页面源捕获base-64编码的SAML断言XML
清单6.已签名的SAML身份验证响应的示例
<samlp2:Response Version="2.0" ID="SAML-46528e40-71c1-4065-be36-3f3b041a9c93"
 IssueInstant="2014-07-28T03:35:23Z"
 InResponseTo="_2RWCvoeG0FNhRmMRwdlJnZzhVKmgME5u1MUEJJgquj_5CpqN_8xvDmQxUF.fdnfU_8wBHMVwn
AYHvOfS0Sh25dCPo5GJhnTEMLCD6GPDPba0UhS2luq0QFCqQWDSQrVI4A4XnK5lfntptA2mJMX1687Oi1bDugUZF9
KxRMluffvhfZber6LQX4enqbtqN2OqngPp.kI_jZFpSg1q7Oo2pwwC_btWiIA"
 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-46528e40-71c1-4065-be36-3f3b041a9c93">
 <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>UQfHUqRZdwnScs464iGeEIh3yRI=</DigestValue>
 </Reference>
 </SignedInfo>
 <SignatureValue>nT3te6rSK1mU65Jv3aktug+5HIO5etw+j9gAqD7BddRQEBHkN8avKoPd61UiYzSz+u
xgIQ1QRq1NTu7jj9Cvs0zDkvGBWO34I.................................</SignatureValue>
 <KeyInfo>
 <X509Data>
 <X509Certificate>MIIDtzCCAp+gAwIBAgIIAhBEWantyAswDQYJKoZIhvcNAQEFBQAwQjELMAk
GA1UEBhMCVVMxDDAKBgNVBAoTA0l......................................</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:Assertion Version="2.0" ID="SAML-085f5b59-6b4d-4c8e-a531-02676c2fc627"
 IssueInstant="2014-07-28T03:35:23Z" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
      <saml2:Issuer>https://datapowersso.ibm.com/</saml2:Issuer>
 <saml2:Subject>
 <saml2:NameID
 Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">
 sdfc.user@sso.sdfc.com</saml2:NameID>
 <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
 <saml2:SubjectConfirmationData
 NotOnOrAfter="2014-07-28T03:43:23Z"
 Recipient="https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC"/>
 </saml2:SubjectConfirmation>
 </saml2:Subject>
 <saml2:Conditions NotBefore="2014-07-28T03:32:23Z"
 NotOnOrAfter="2014-07-28T03:43:23Z">
 <saml2:AudienceRestriction>
            <saml2:Audience>https://dipak-sdfc-dev-ed.my.salesforce.com</saml2:Audience>
 </saml2:AudienceRestriction>
 </saml2:Conditions>
 <saml2:AuthnStatement AuthnInstant="2014-07-28T03:35:23Z"
 SessionNotOnOrAfter="2014-07-28T03:43:23Z">
 <saml2:SubjectLocality Address="100.99.99.99"/>
 <saml2:AuthnContext>
 <saml2:AuthnContextClassRef>
urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml2:AuthnContextClassRef>
 </saml2:AuthnContext>
 </saml2:AuthnStatement>
 <saml2:AttributeStatement>
 <saml2:Attribute Name="ssoStartPage"
 NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
            <saml2:AttributeValue>https://datapowersso.ibm.com/</saml2:AttributeValue>
 </saml2:Attribute>
 <saml2:Attribute Name="logoutURL"
 NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
 <saml2:AttributeValue/>
 </saml2:Attribute>
 </saml2:AttributeStatement>
 </saml2:Assertion>
</samlp2:Response>

以管理员身份登录到Salesforce,并验证base-64编码的SAML声明,以检查SSO身份提供程序(DataPower)是否生成了Salesforce期望的正确SAML声明。 图49至52显示了使用Force.com SAML断言验证器框架进行的SAML断言验证。

图49.在Salesforce上启动SAML断言验证器框架
在Salesforce上启动SAML断言验证器框架
图50.将base-64编码的SAML断言输入到Salesforce SAML Validator中
将base-64编码的SAML断言输入到Salesforce SAML验证程序中
图51.在Salesforce SAML验证器上成功的SAML断言验证
在Salesforce SAML验证程序中成功进行SAML断言验证
图52.带有过期时间戳记的无效SAML断言
时间戳过期的无效SAML声明

在测试SSO登录名时,您可以从Salesforce管理员的单独登录名中监视Force.com上的登录历史记录。 图53显示了Force.com站点上的登录历史记录页面,该页面可以帮助您解决SSO登录失败。

图53. Force.com的登录历史记录页面
Force.com上的登录历史记录页面

结论

Salesforce用户较少的组织可能不需要单一登录解决方案,因为他们可以继续使用Salesforce标准登录过程。 但是,拥有大量Salesforce用户的组织可以通过为其所有内部应用程序以及支持Federated的基于云的和外部应用程序(例如Force.com)实施基于DataPower的单点登录基础结构来利用此解决方案。使用外部SSO身份提供程序进行身份管理。

要继续本系列,请参阅以下教程:


翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1505_pal3/1505_pal3.html

sso saml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值