随着更多机构和组织在线提供服务和开展协作,员工既需要访问内部部署的应用程序,还需要访问基于云的应用程序才能完成其日常工作。这需要实现一种单点登录 (SSO) 基础架构,使用户只需登录一次,即可访问所有授权的内部和外部资源和应用程序。拥有大量 Salesforce 用户的组织可利用其现有的 SSO 基础架构,实现对 Force.com 平台的 SSO,这支持外部 SSO 身份提供程序所支持的联合身份管理。Force.com 平台同时支持对 SSO 执行委托和联合身份验证。
本教程只关注 联合身份验证 ,它与委托身份验证相比有多种优势,在 IT 行业得到广泛接受。联合身份验证不会在 Force.com 平台上验证用户的实际密码。相反,该平台在一个 HTTP POST 请求中收到一个安全断言标记语言 (Security Assertion Markup Language, SAML) 断言。该 SAML 断言具有有限的有效期,包含一个唯一标识符,已经过数字签名,而且还可选择加密。如果断言在其有效期内仍有效,拥有之前未使用过的身份,而且拥有来自一个受信任身份提供程序的有效签名,则用户有权访问请求的资源或页面。使用 IBM® WebSphere DataPower(下文简称 DataPower)作为 SSO 身份提供程序,企业可实现单个用户身份注册表,为其所有支持联合单点登录的内部应用程序以及外部应用程序(例如 Force.com)提供一个集中化的管理界面。
本系列包含以下 4 部教程:
回页首
SAML 提供了一个安全、基于 XML 的解决方案来在身份提供程序(比如 DataPower)和服务提供程序(比如 Force.com)之间交换用户身份信息。除了身份提供程序发起的单点登录,SAML 2.0 还支持服务提供程序发起的单点登录。这使 Force.com 等服务提供程序能够查询身份提供程序来执行身份验证。SAML 2.0 还添加了一个叫做 “单一注销” 的有用特性,该特性定义了一种快速且轻松地从所有服务提供程序注销的机制。
一个 SAML 事务中有 3 个参与方:
SAML 有两个重要的使用案例:
Force.com 同时支持这两种使用案例。但是,本教程(第 1 部分)的范围仅限于身份提供程序发起的 SSO 登录,使用了一个已签名的 SAML 断言。
来自身份提供程序的 SAML 断言响应以属性和条件的形式包含标头信息、主体和有关该主体的断言语句。本示例中使用的 SAML 断言包含一个来自身份提供程序的联合 ID,该 ID 在 Force.com 平台中唯一并映射到一个 Force.com 用户,如图 1 和图 2 所示。
图 1. 身份提供程序向 Salesforce 发起的 SSO 登录
图 2. 身份提供程序发起的 SSO 登录流程
回页首
本节给出了在 Force.com 平台上设置单点登录的分步指南。
回页首
图 3. 创建 Salesforce 用户帐户(开发人员版)
点击查看大图
关闭 [x]
用户 ID: sdfc.user@sdfc.com
联合 ID: sdfc.user@sso.sdfc.com
图 4. 输入一个联合 ID 来启用 SSO
图 5. Salesforce 上的用户帐户(标准平台用户)详细信息
点击查看大图
关闭 [x]
回页首
图 6. Salesforce 上的自签名证书列表
点击查看大图
关闭 [x]
图 7. 自签名证书(标签:Salesforce SSO)详细信息页面
点击查看大图
关闭 [x]
回页首
使用 “My Domain”,您可以定义一个自定义的 Salesforce 域名(参见图 8)。自定义的域名可帮助您以多种方式更好地管理您组织的登录和身份验证。请参阅 Salesforce 文档 了解域管理详细信息。本教程系列演示的示例使用了以下域名。我们建议为您的组织使用一个合适的域名。一个域名示例: https://dipak-sdfc-dev-ed.my.salesforce.com/ 。
图 8. Salesforce 上的 My Domain 概述页面
点击查看大图
关闭 [x]
回页首
https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC )。 图 9. Salesforce 上的 SAML 单点登录设置
点击查看大图
关闭 [x]
图 10. Force.com 上的 SAML 单点登录设置详细信息
点击查看大图
关闭 [x]
回页首
以下步骤介绍了如何开发必要的 DataPower 工件,主要包含一个 HTTPS 前端处理函数、一个包含需要的处理策略规则的多协议网关,以及一个 AAA 策略。
回页首
temporary:// 目录下载它。 图 11. 本示例中使用的 DataPower 加密密钥
图 12. 本示例中使用的 DataPower 加密证书
图 13. 配置加密证书并导入 Salesforce 证书
图 14. 使用 DataPower 加密密钥配置加密身份凭据
图 15. 配置加密验证凭据
图 16. 配置加密配置文件
图 17. 配置 SSL 代理配置文件
回页首
创建一个 HTTPS 前端处理函数(图 18)来接受来自浏览器的 SSO 请求。
图 18. 配置 HTTPS 前端处理函数
点击查看大图
关闭 [x]
回页首
使用动态后端路由创建一个多协议网关(图 19)。确保为请求和响应数据类型都选择了 Non-XML ,以便处理 HTTP 格式数据和 HTML 数据。下一步(第 8 步)介绍多协议网关策略的详细信息。
图 19. 配置多协议网关
点击查看大图
关闭 [x]
回页首
使用以下处理规则创建一个多协议网关策略:
方向:客户端到服务器。
/favicon.ico var://service/mpgw/skip-backside 图 20. 处理来自浏览器的 favicon.ico 请求的多协议网关策略规则
点击查看大图
关闭 [x]
图 21. 处理来自浏览器的 SSO 登录请求的多协议网关策略规则
点击查看大图
关闭 [x]
方向:客户端到服务器。
/sso/salesforce/login 备注: 基于您组织的标准而使用合适的 URL。 使用清单 1 中所示的 XSLT ( remove-specific-attribute.xsl ) 从 < SubjectConfirmationData > 元素中删除 @NotBefore 属性,因为 Salesforce SAML Assertion Validator Framework 不支持此属性。
图 22. 在转换操作中使用 XSLT 从 SAML 断言 XML 删除属性
点击查看大图
关闭 [x]
清单 1. 从 SAML 断言 XML 中删除一个特定属性的 XSLT [remove-specific-attribute.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="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>
此操作对 SAML 断言 XML 执行数字签名 (XPATH: /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:protocol' and local-name()='Response']) ,方法是使用第 5 步中生成的 DataPower 加密密钥和证书。
图 23. 对 SAM 断言 XML 进行签名
点击查看大图
关闭 [x]
这个 转换 操作生成一个 HTML 页面,其中包含一个包含 HTTP POST 操作的 HTML FORM,包含一个 base-64 编码的 SAML 断言 XML 作为隐藏的参数。图 34 显示了在成功验证后 DataPower 响应的一个示例 HTML 页面。为此操作使用清单 2 中所示的 XSLT ( SSO-Generate-HTML-Idp.xsl )。确保使用第 4 步中获取的合适的 Salesforce 登录 URL 更新了该 XSLT(XSLT 变量: sdfcLoginURL ) 。
图 24. 生成 HTML 响应的 XSLT 转换
点击查看大图
关闭 [x]
清单 2. 生成 HTML 页面的 XSLT [SSO-Generate-HTML-Idp.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="html" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:param name="sdfcLoginURL" select="'https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC'"/> <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"> <xsl:value-of select="''"/> </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> var://service/mpgw/skip-backside 图 25. 跳过后端路由的高级操作
图 26. 结果操作
回页首
图 27. AAA 操作
图 28. AAA 策略 – 从请求中提取身份
图 29. AAA 策略 – 验证用户
图 30. AAA 策略 – 授权请求
清单 3. 示例 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>
https://datapowersso.ibm.com/ )。在 “SAML Audience” 字段中输入来自 Salesforce SSO 设置(第 4 步)的 Entity ID 值。在 “SAML Recipient” 和 “Response Destination” 字段中都使用了 Salesforce 登录 URL。创建 SAML 属性定义,如图 32 所示。 图 31. AAA 策略 – 生成 SAML 断言响应
点击查看大图
关闭 [x]
图 32. AAA 策略 – SAML 属性
点击查看大图
关闭 [x]
回页首
在 Web 浏览器中输入您的身份提供程序(比如 DataPower)SSO 登录 URL(比如 https://<dp-host:port>/sso/salesforce/login ),如图 33 所示。在成功身份验证后, DataPower 将以一个 SSO 重定向(HTTP POST 绑定)页面作为响应,如图 34 所示,其中包含一个具有 HTTP POST 操作的 HTML FORM,还包含一个 base-64 编码的 SAML 断言 XML 和 RelayState 作为隐藏参数。它需要一次用户交互,单击 Login to Salesforce 按钮来提交 HTML 页面,这会导致将一个 HTTP POST 请求提交到 Salesforce 登录 URL(比如 https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC )。
Salesforce 使用 SAML 断言 XML 中嵌入的签名,针对 DataPower 证书来验证消息完整性,该证书已在 SSO 设置过程中上传。在成功验证签名后,它会处理 SAML 断言陈述,提取并验证联合 ID,最终重定向到最初请求的页面。图 35 显示了本示例尝试 SSO 登录成功后的 Salesforce 着陆页(landing page)。
图 33. 用户通过 Web 浏览器进行的 SSO 登录尝试
点击查看大图
关闭 [x]
图 34. 成功身份验证后的 SSO 重定向(HTTP POST 绑定)页面
点击查看大图
关闭 [x]
图 35. 成功 SSO 登录后的 Sales 着陆页
点击查看大图
关闭 [x]
回页首
假设您熟悉 DataPower 常见调试和故障排除流程,本教程将会主要介绍 Salesforce。
您可以使用 Google® Chrome 中的 开发人员工具 捕获 base-64 编码的 SAML 断言 XML(参见图 36 和图 37)。尽管可以从 HTML 页面源代码获取此数据,但使用 开发人员工具 或 Internet Explorer 可以帮助您分析 HTTP 事件,包括请求/响应标头和数据结构。您可以使用任何在线工具(比如 http://www.string-functions.com/base64decode.aspx )解码 (base-64) 此数据,获取 SAML 断言 XML。清单 4 给出了一段示例 SAML 断言 XML。
图 36. 启动 Google Chrome 中的开发人员工具
图 37. 从 HTML 捕获 base-64 编码的 SAML 断言 XML
点击查看大图
关闭 [x]
清单 4. 示例 SAML 断言 XML(已签名)
<samlp2:Response Version="2.0" ID="SAML-88fe1652-686b-4ef6-b5d8-80643ddbd791" IssueInstant="2014-07-27T21:36:09Z" 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-88fe1652-686b-4ef6-b5d8-80643ddbd791"> <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>1hL2WyVjm9cYVUUrOWWUTc4zN5I=</DigestValue> </Reference> </SignedInfo> <SignatureValue>wZm0YCeXOlsEfepgf+a7LOW6I/PXbycIt0JQA1XJ1lU57VT5rxw2cSdGziqYw pNT3wai7oPLdsSmzSuTkiocOjfT6BJSUJnebED/m4irUOcTa.....................</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIDtzCCAp+gAwIBAgIIAhBEWantyAswDgMBAAGjgbAwga0wDAYDVR0TBAU wAwEB/zAdBgNVHQ4EFgQUW0S1wlYr4NrKH41aKejdlM0o1RQwcQ...................</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-d5027598-fd26-4ada-a87c-55ccdfde26d2" IssueInstant="2014-07-27T21:36:09Z" 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-27T21:44:09Z" Recipient="https://dipak-sdfc-dev-ed.my.salesforce.com?so=00DF0000000ghLC"/> </saml2:SubjectConfirmation> </saml2:Subject> <saml2:Conditions NotBefore="2014-07-27T21:33:09Z" NotOnOrAfter="2014-07-27T21:44:09Z"> <saml2:AudienceRestriction> <saml2:Audience>https://dipak-sdfc-dev-ed.my.salesforce.com</saml2:Audience> </saml2:AudienceRestriction> </saml2:Conditions> <saml2:AuthnStatement AuthnInstant="2014-07-27T21:36:09Z" SessionNotOnOrAfter="2014-07-27T21:44:09Z"> <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 断言。图 39 到 41 显示了使用 Force.com 的 SAML Assertion Validator Framework 执行 SAML 断言验证的过程。
图 38. 启动 Salesforce 上的 SAML Assertion Validator Framework
点击查看大图
关闭 [x]
图 39. 将 base-64 编码的 SAML 断言输入到 Salesforce SAML Validator 中
图 40. 在 Salesforce SAML Validator 上成功验证 SAML 断言
点击查看大图
关闭 [x]
图 41. 包含过期的时间戳的无效 SAML 断言
点击查看大图
关闭 [x]
在测试 SSO 登录期间,您可监视一个管理员登录名在 Force.com 上的登录历史。图 42 显示了 Force.com 站点上的登录历史页面,可以帮助您排除 SSO 登录故障。
图 42. Force.com 上的登录历史页面
点击查看大图
关闭 [x]
回页首
拥有较少 Salesforce 用户的组织可能不需要这个单点登录解决方案,因为他们可以继续使用 Salesforce 的标准登录流程。但是,拥有大量 Salesforce 用户的组织可以利用此解决方案,为其所有内部应用程序以及基于云的应用程序和外部应用程序(比如 Force.com)实现一个基于 DataPower 的单点登录基础架构,这支持使用外部 SSO 身份提供程序执行联合身份管理。
要继续学习本系列,请参阅以下教程: