當idp與user建立起聯系后,idp向sp發送響應
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_81e65e52081649f77587dd7a12b0e3c3" InResponseTo="6541c310-4e01-4d85-8f8b-3d05d119b9c2" IssueInstant="2020-04-18T08:13:50.867Z" Version="2.0" > <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost:8080/idp</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="18dfba4b-e0b5-46fa-b7b7-7fdbbe295b39" IssueInstant="2020-04-18T08:13:50.866Z" Version="2.0" > <saml:Issuer>http://localhost:8080/idp</saml:Issuer> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI="#18dfba4b-e0b5-46fa-b7b7-7fdbbe295b39"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>vFGoJhHTVDDvkRz9bezf9+zhEBs=</DigestValue> </Reference> </SignedInfo> <SignatureValue>DuvgFw+uqHeMZr5y/1iF29ZNB6Gt6Vj6IqyIN4wR0Ty5EVd2iaYREQxIRv+/xLoko7XiO4o3bkFs 6g/mlDc3Bs81LZYBCW11kTlDNtayQtuffzvdI+w9Z4h5pFo8uvAo7bA4hDPlUSsewu/5MOGMUiiI 4b/HoIrb7sCeZgnFF8k=</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIICcjCCAdugAwIBAgIEYUV9sjANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdVbmtub3duMRAw DgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYDVQQKEwdVbmtub3duMRAwDgYD VQQLEwdVbmtub3duMRAwDgYDVQQDEwdVbmtub3duMB4XDTE3MTIyMTA2NDc0MloXDTI3MTIxOTA2 NDc0MlowbDEQMA4GA1UEBhMHVW5rbm93bjEQMA4GA1UECBMHVW5rbm93bjEQMA4GA1UEBxMHVW5r bm93bjEQMA4GA1UEChMHVW5rbm93bjEQMA4GA1UECxMHVW5rbm93bjEQMA4GA1UEAxMHVW5rbm93 bjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtD3CyKRmy7aaTOeBCDiQaqGQu99wEAHqbcXu 7/ZkNYGlb9HIGM4ga5rnQqrZIR+1njcss1B+6agRmREu3Db9SKL6OqsdKEY8KZX318VhksoECK1m FvzuwK/S7VAHAay3ApLfBMCC+8sZ7njvByqSo0CAFAcQvu5mtkYPC6xzHX0CAwEAAaMhMB8wHQYD VR0OBBYEFMcXi7CGVHaw7JLJlEi3mSV0ny4QMA0GCSqGSIb3DQEBCwUAA4GBAIM4m+sXq/S5ryxa Lf8o/HlKHj+61e6n6vP+zrVnAuXiNNjEI76PQWws+1CpaZq2XI0IC+mY1SwdrvltUTCiTFEv3NA5 EhnB6aPUHORX2WF80s6yEq8AZ0IITRL2nxilb+kWxbU/BKLN7qWXcwEI/mKM/Aowha6vYxtnIYy2 H8hy</X509Certificate> </X509Data> </KeyInfo> </Signature> <saml:Subject> <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@qq.com</saml:NameID> <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml:SubjectConfirmationData Recipient="http://localhost:8080/sp/consumer" /> </saml:SubjectConfirmation> </saml:Subject> <saml:Conditions NotBefore="2020-04-18T08:13:35.866Z" NotOnOrAfter="2020-04-18T08:14:20.866Z" > <saml:AudienceRestriction> <saml:Audience>http://localhost:8080/sp</saml:Audience> </saml:AudienceRestriction> </saml:Conditions> <saml:AuthnStatement AuthnInstant="2020-04-18T08:13:50.866Z"> <saml:AuthnContext> <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> </saml:AuthnContext> </saml:AuthnStatement> </saml:Assertion> </samlp:Response>
1、 samlp:Response
根節點,表明這是一個 response 對象
2、 Destination
目標地址,即 ACS 地址,Response 返回的地址
3、 ID
唯一標識
4、 IssueInstant
時間戳
5、 saml:Issuer
IDP 身份信息,IDP 的 EntityId
6、 samlp:Status
認證結果, samlp:StatusCode
表明認證成功或失敗
7、 saml:Assertion
斷言,這是 Response 中最為重要的字段,里面包含着用戶身份信息
8、 Signature
斷言的簽名,使用非對稱私鑰對 Assertion 內容(不包含 Signature)進行簽名,防止信息被篡改
9、 saml:Subject
身份主體,主要包括身份信息
10、 saml:NameID
身份信息
11、 saml:Conditions
給出了斷言被認為有效的驗證條件。
12、 saml:AuthnStatement
描述了在身份提供者的認證行為。
首先生成斷言信息 Assertion,然后對斷言進行簽名,將簽名信息插入到 Assertion 的子節點中,即 <Signature>
的信息,最后生成 Response 結構,將 Response 字符串進行 base64 編碼后 post 到 acs 地址上,SP 對其進行驗證。
SAML 中的簽名:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI="#18dfba4b-e0b5-46fa-b7b7-7fdbbe295b39"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>vFGoJhHTVDDvkRz9bezf9+zhEBs=</DigestValue> </Reference> </SignedInfo> <SignatureValue>DuvgFw+uqHeMZr5y/1iF29ZNB6Gt6Vj6IqyIN4wR0Ty5EVd2iaYREQxIRv+/xLoko7XiO4o3bkFs 6g/mlDc3Bs81LZYBCW11kTlDNtayQtuffzvdI+w9Z4h5pFo8uvAo7bA4hDPlUSsewu/5MOGMUiiI 4b/HoIrb7sCeZgnFF8k=</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIICcjCCAdugAwIBAgIEYUV9sjANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdVbmtub3duMRAw DgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYDVQQKEwdVbmtub3duMRAwDgYD VQQLEwdVbmtub3duMRAwDgYDVQQDEwdVbmtub3duMB4XDTE3MTIyMTA2NDc0MloXDTI3MTIxOTA2 NDc0MlowbDEQMA4GA1UEBhMHVW5rbm93bjEQMA4GA1UECBMHVW5rbm93bjEQMA4GA1UEBxMHVW5r bm93bjEQMA4GA1UEChMHVW5rbm93bjEQMA4GA1UECxMHVW5rbm93bjEQMA4GA1UEAxMHVW5rbm93 bjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtD3CyKRmy7aaTOeBCDiQaqGQu99wEAHqbcXu 7/ZkNYGlb9HIGM4ga5rnQqrZIR+1njcss1B+6agRmREu3Db9SKL6OqsdKEY8KZX318VhksoECK1m FvzuwK/S7VAHAay3ApLfBMCC+8sZ7njvByqSo0CAFAcQvu5mtkYPC6xzHX0CAwEAAaMhMB8wHQYD VR0OBBYEFMcXi7CGVHaw7JLJlEi3mSV0ny4QMA0GCSqGSIb3DQEBCwUAA4GBAIM4m+sXq/S5ryxa Lf8o/HlKHj+61e6n6vP+zrVnAuXiNNjEI76PQWws+1CpaZq2XI0IC+mY1SwdrvltUTCiTFEv3NA5 EhnB6aPUHORX2WF80s6yEq8AZ0IITRL2nxilb+kWxbU/BKLN7qWXcwEI/mKM/Aowha6vYxtnIYy2 H8hy</X509Certificate> </X509Data> </KeyInfo> </Signature>
SAML 中的簽名算法就是對 xml 文檔樹進行簽名,說明如下:
1、確認簽名內容,通過 URL 將這些內容表示為引用資源,用 Reference 標識。對於斷言信息來說,其 URI 是saml:Assertion的 ID
2、對待簽名的數據進行轉化處理,包括執行編碼規則、規范化算法等, Transform 指定了轉化的算法
3、對整個斷言進行消息摘要, DigestMethod 指定了消息摘要算法,消息摘要的結果保存在 DigestValue 元素中
4、構造包含 Reference 的 SignedInfo 元素
5、 CanonicalizationMethod 元素指定了規范化的算法,如果不對其進行規范化處理,驗證 xml 簽名時可能因為 xml 結構表示不同而失敗
6、計算 SignedInfo 的摘要,使用 SignatureMethod 聲明的簽名算法,並對其進行簽名,結果保存到 SignatureValue 元素中
7、 KeyInfo 元素可選,表明簽名的公鑰信息
SP 接收到 IDP 的響應后,驗證簽名,獲取用戶的信息后跳轉響應頁面。