Salesforce SSO

来源:互联网 发布:软件开发财务报表 编辑:程序博客网 时间:2024/05/18 00:27

根据别人的博客自己整理的逻辑图:


下方描述摘自:http://www.cnblogs.com/shuidao/p/3463947.html

首先, 你(client)是idp的注册用户, 它有你的用户名和密码,它可以认证你就是你。 其次, SP和Idp两者会被各自的域管理员设置为相互信任对方。并且双方都持有对方的公钥。这是配置好的。第三,有一天,你需要访问sp提供的某个服务,但是sp并不认识你,也没有你的用户名和密码因此不能认证你。 于是就发生了上图所示的8个步骤:

1. 你去访问sp的某个受保护资源,比如浏览器打开: http://www.apc.com/resource1.aspx.

2. sp发现你是新来的,没有认证信息。当然不能给你这个页面内容了。 他就会生成一个 saml的认证请求数据包(当然是saml格式的)。把这个请求放在一个html的form的一个隐藏的域中,把这个html form返回给你。 这个form后面有一句javascript自动提交这个form。 二而form的action地址就是 提前配置好的 idp上的一个地址。 

saml认证请求的数据包可能是这个样子的:

==========

<samlp:AuthnRequest

    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"

    ID="aaf23196-1773-2113-474a-fe114412ab72"

    Version="2.0"

    IssueInstant="2004-12-05T09:21:59"

    AssertionConsumerServiceIndex="0"

    AttributeConsumingServiceIndex="0">

    <saml:Issuer>https://sp.example.com/SAML2</saml:Issuer>

    <samlp:NameIDPolicy

      AllowCreate="true"

      Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>

  </samlp:AuthnRequest>

==========

而返回的html from内容大概设这个样子的:它包含了上面的数据包作为其中一个hidden的值。

=============================

<form method="post" action="https://idp.example.org/SAML2/SSO/POST" ...>

    <input type="hidden" name="SAMLRequest" value="<samlp:AuthnRequest>.......... </samlp:authnreques>"/>

    ... other input parameter....

    <input type="submit" value="Submit" />


</form>


<javascript>

document.form[0].submit();// 后面紧跟一句类似这样的提交代码.

</javascript>

=============================

这些代码一部分是复制过来的, 有些是我现写的, 大家领会意思即可,不要在意那些细节。

 

3. 上面的form会被javascript自动提交到idp的某个地址。

4. idp也需要认证你, 于是返回给你一个认证的页面, 可能使用用户名密码认证,也可以使用ntlm认证等等一切可以认证你的方式。 因为idp保存有你的用户名和密码。

5. 同上一步,也是认证你的一个过程。

6. idp在认证你之后。觉得你合法, 于是就为你生成一些断言, 证明你是谁,你有什么权限等等。 并用自己的私钥签名。 然后包装成一个response格式,放在form里返回给你。

断言的格式大概如下:

=============

<saml:Assertion

   xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"

   xmlns:xs="http://www.w3.org/2001/XMLSchema"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   ID="b07b804c-7c29-ea16-7300-4f3d6f7928ac"

   Version="2.0"

   IssueInstant="2004-12-05T09:22:05">

   <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>

   <ds:Signature

     xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>

   <saml:Subject>

..........

   </saml:Subject>

   <saml:Conditions

.........

   </saml:Conditions>

   <saml:AuthnStatement

     AuthnInstant="2004-12-05T09:22:00"

     SessionIndex="b07b804c-7c29-ea16-7300-4f3d6f7928ac">

     <saml:AuthnContext>

       <saml:AuthnContextClassRef>

         urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport

      </saml:AuthnContextClassRef>

     </saml:AuthnContext>

   </saml:AuthnStatement>

   <saml:AttributeStatement>

     <saml:Attribute

       xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"

       x500:Encoding="LDAP"

       NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"

       Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"

       FriendlyName="eduPersonAffiliation">

       <saml:AttributeValue

         xsi:type="xs:string">member</saml:AttributeValue>

       <saml:AttributeValue

         xsi:type="xs:string">staff</saml:AttributeValue>

     </saml:Attribute>

   </saml:AttributeStatement>

 </saml:Assertion>

=============

其中authnstatement认证语句表示你认证成功了。subject表示你是谁。而attributestatement表示你有哪些属性。 还有一个授权语句上面例子中没有。

Response语句大概如下:

============================

 <samlp:Response

    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"

    ID="identifier_2"

    InResponseTo="identifier_1"

    Version="2.0"

    IssueInstant="2004-12-05T09:22:05"

    Destination="https://sp.example.com/SAML2/SSO/POST">

    <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>

    <samlp:Status>

      <samlp:StatusCode

        Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>

    </samlp:Status>

    <saml:Assertion

      xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"

      ID="identifier_3"

      Version="2.0"

      IssueInstant="2004-12-05T09:22:05">

      <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>

      <!-- a POSTed assertion MUST be signed -->

     ....................

    </saml:Assertion>

  </samlp:Response>

============================

正如上面第2步一样,它也会把response包装在一个form里面返回给你,并自动提交给 sp的某个地址。

===========

 <form method="post" action="https://sp.example.com/SAML2/SSO/POST" ...>

    <input type="hidden" name="SAMLResponse" value="<samlp:Response>.........</samlp:respons>" />

    <input type="hidden" name="RelayState" value="''token''" />

    ...

    <input type="submit" value="Submit" />

  </form>

<javascript>

document.form[0].submit();// 后面紧跟一句类似这样的提交代码.

</javascript>

 

===========

 

7. 于是就到了第7步, 这个form被javascript自动提交到sp了。 

8. sp读到form提交上来的 断言。 并通过idp的公钥验证了断言的签名。 于是信任了断言。 知道你是idp的合法用户了。 所以就最终给你返回了你最初请求的页面了。  http://www.apc.com/resource1.aspx.




salesforce端的配置




各个参数的含义参考 https://help.salesforce.com/articleView?id=sso_saml_idp_values.htm&type=0


还有可以在trailhead进行实际操作