SAML 单点登录流
当您使用安全声明标记语言 (SAML) 设置单点登录 (SSO) 时,您可以从服务提供商或身份提供商启动登录。服务提供商发起的登录和身份提供商发起的登录使用不同的流,但都会导致用户登录到服务提供商。
所需的 Edition
| 适用于 Salesforce Classic 和 Lightning Experience |
| 适用于:Developer、Enterprise、Performance、Unlimited 和 Database.com Edition |
| 所需用户权限 | |
|---|---|
| 定义和修改身份提供商和服务提供商: | 自定义应用程序 |
SAML 安全性
要了解这些 SSO 流的工作方式,了解提供商如何使用 SAML 交换安全信息非常重要。
对于这两种 SAML SSO 流变体,身份提供商对用户进行身份验证,并确认用户是他们所说的那个人。在身份提供商对用户进行身份验证后,它使用 SAML 响应来告诉服务提供商用户是谁以及允许他们做什么。它将有关用户身份的信息存储在响应的特定部分,称为 SAML 声明。
为了表示服务提供商可以Trust SAML 响应,身份提供商签署了响应正文、声明或两者。响应正文或声明是否签名取决于身份提供商。
- 如果您将 Salesforce 用作身份提供商,Salesforce 会签署 SAML 响应正文和声明。
- 如果您使用第三方身份提供商,请咨询您的身份提供商,了解他们如何签署 SAML 响应。
当服务提供商收到 SAML 响应时,它会验证此签名。签名的验证方式取决于服务提供商。
- 如果您将 Salesforce 用作身份提供商,请咨询您的服务提供商,了解他们如何验证签名。因为 Salesforce 签署响应正文和声明,所以它兼容各种服务提供商。
- 如果您将 Salesforce 用作服务提供商,Salesforce 可以在响应正文或声明中验证签名。Salesforce 首先在响应正文中查找签名。如果响应签名丢失或无效,Salesforce 会尝试验证 SAML 声明中的签名。即使攻击者从用户的浏览器中捕获 SAML 响应并篡改响应正文,只要声明签名完整,SSO 登录就不会有风险。
如果您的身份提供商支持加密的 SAML 声明以获得额外安全性,您还可以配置 Salesforce 来解密和验证这些声明。
服务提供商发起的 SAML 流
在服务提供商发起的流中,服务提供商通过向身份提供商发出 SAML 请求来开始登录过程。以下是这个流的工作原理。
- 用户请求安全会话来访问服务提供商中的受保护资源。例如,用户单击链接填写服务提供商的表单。但是表单是受保护的资源,这意味着用户只能在登录后才能访问它。
- 服务提供商通过向身份提供商发送 SAML 请求来启动登录,要求它对用户进行身份验证。
- 身份提供商将用户发送到登录页面。
- 用户输入其身份提供商登录凭据,身份提供商对用户进行身份验证。
- 身份提供商现在知道用户是谁,所以它向服务提供商发送加密签名的 SAML 响应。SAML 响应包含 SAML 声明,它告诉服务提供商用户是谁。
- 服务提供商验证 SAML 响应中的签名并识别用户。
- 用户现在登录到服务提供商,可以访问受保护的资源。
身份提供商发起的 SAML 流
在身份提供商发起的登录流中,SAML 请求是不必要的,因为身份提供商用 SAML 响应启动流。身份提供商发起的流是服务提供商发起的流的缩短版本。以下是这个流的工作原理。
- 用户登录身份提供商。
- 用户单击按钮或链接访问服务提供商。例如,用户在 Salesforce 组织的应用程序启动程序页面上单击应用程序。
- 身份提供商通过向服务提供商发送加密签名的 SAML 响应来启动登录。SAML 响应包含 SAML 声明,它告诉服务提供商用户是谁。
- 服务提供商验证 SAML 响应中的签名并识别用户。
- 用户现在登录到服务提供商。
SAML 请求和响应示例
下面是一个 SAML 请求的示例。在服务提供商发起的流中,服务提供商发送 SAML 请求来启动登录过程。
<samlp:AuthnRequest ID="bndkmeemcaamihajeloilkagfdliilbhjjnmlmfo" Version="2.0"
IssueInstant="2010-05-24T22:57:19Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
ProviderName="google.com" IsPassive="false"
AssertionConsumerServiceURL="https://www.google.com/a/resp.info/acs">
<saml:Issuer>google.com</saml:Issuer>
<samlp:NameIDPolicy AllowCreate="true"
Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>
</samlp:AuthnRequest>下面是一个 SAML 响应的示例。在服务提供商发起的流中,身份提供商在服务提供商发送 SAML 请求后发送 SAML 响应。在身份提供商发起的流中,身份提供商通过发送 SAML 响应来启动流。
在此示例中,响应正文已签名,但声明本身未签名。
<samlp:Response Destination="https://MyDomainName.my.salesforce.com?so=00Dx00000000001"
ID="_0f551f9288c8b76f21c3d4d15c9cd1df1290476801091"
InResponseTo="_2INwHuINDJTvjo8ohcM.Fpw_uLukYi0WArVx2IJD569kZYL
osBwuiaSbzzxOPQjDtfw52tJB10VfgPW2p5g7Nlv5k1QDzR0EJYGgn0d0z8
CIiUOY31YBdk7gwEkTygiK_lb46IO1fzBFoaRTzwvf1JN4qnkGttw3J6L4b
opRI8hSQmCumM_Cvn3DHZVN.KtrzzOAflcMFSCY.bj1wvruSGQCooTRSSQ"
IssueInstant="2010-11-23T01:46:41.091Z" Version="2.0">
<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
>https://myidp.my.salesforce.com</saml:Issuer>
−
<ds:Signature>
−
<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="#_0f551f9288c8b76f21c3d4d15c9cd1df1290476801091">
−
<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 xs"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>4NVTbQ2WavD+ZBiyQ7ufc8EhtZw=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
−
<ds:SignatureValue>
ExampleSamlSignature</ds:SignatureValue>
−
<ds:KeyInfo>
−
<ds:X509Data>
−
<ds:X509Certificate>ExampleX509 Certificate</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
−
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
−
<saml:Assertion ID="_e700bf9b25a5aebdb9495fe40332ef081290476801092" IssueInstant="2010-11-23T01:46:41.092Z" Version="2.0">
<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://exampleidp.com</saml:Issuer>
−
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">exampleuser@salesforce.com</saml:NameID>
−
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData NotOnOrAfter="2010-11-23T01:51:41.093Z" Recipient="https://MyDomainName.my.salesforce.com?so=00Dx00000000001"/>
</saml:SubjectConfirmation>
</saml:Subject>
−
<saml:Conditions NotBefore="2010-11-23T01:46:41.093Z" NotOnOrAfter="2010-11-23T01:51:41.093Z">
−
<saml:AudienceRestriction>
<saml:Audience>https://exampleserviceprovider.com</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
−
<saml:AuthnStatement AuthnInstant="2010-11-23T01:46:41.092Z">
−
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
−
<saml:AttributeStatement>
−
<saml:Attribute Name="userId" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue xsi:type="xs:anyType">005D0000001Ayzh</saml:AttributeValue>
</saml:Attribute>
−
<saml:Attribute Name="username" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue xsi:type="xs:anyType">admin@identity.org</saml:AttributeValue>
</saml:Attribute>
−
<saml:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue xsi:type="xs:anyType">exampleuser@salesforce.com</saml:AttributeValue>
</saml:Attribute>
−
<saml:Attribute Name="is_portal_user" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue xsi:type="xs:anyType">false</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>
