乾貨|理解 SAML2 協議

乾貨|理解 SAML2 協議

01

SAML2 綜述

安全斷言標記語言(英語:Security Assertion Markup Language,簡稱SAML,發音 sam-el)是一個基於 XML 的開源標準資料格式,它在當事方之間交換身份驗證和授權資料,尤其是在身份提供者和服務提供者之間交換。SAML2。0 可以實現基於網路跨域的單點登入(SSO), 以便於減少向一個使用者分發多個身份驗證令牌的管理開銷。

SAML 主體

在 SAML 協議中,涉及兩個主體:

Service Provider 服務提供方,簡稱 SP。什麼是服務提供方?例如:阿里雲控制檯、騰訊雲控制檯、AWS 控制檯這些都是服務提供方。

Identity Provider 身份提供方,簡稱 IdP。什麼是身份提供方?Authing 可以作為身份提供方,身份提供方能夠向 SP 傳送身份斷言,所謂身份斷言就是由 Authing 簽發的,可以標識某個人身份的 Token,只不過,在 SAML 協議中,這個 Token 的格式是 XML 形式的。還有一些其他的身份提供方,例如 Okta、SSOCircle、Auth0,他們都可以向 SP 返回身份斷言。

兩個主體透過使用者的瀏覽器進行資訊交換。方式上,SP 可以返回帶引數的重定向 HTTP 響應,讓使用者立刻透過引數將資訊發給 IdP。而 IdP 會返回一個表單,同時還有一段立即提交表單的 JS 程式碼,從而讓使用者立刻將資訊發給 SP。

總結一下,SP 提供服務,需要知道使用者的身份,就需要向 IdP 詢問。IdP 知道使用者的身份,當用戶在 IdP 登入成功,IdP 就將使用者的身份以 SAML 斷言的形式發給 SP。SP 信任 IdP 發來的身份斷言,從而賦予該使用者在 SP 的相關許可權。

SAML Request

當用戶的身份無法鑑定時,SP 會向 IdP 傳送 SAML Request 資訊(透過瀏覽器傳送),請求 IdP 來鑑定使用者身份。

由阿里雲控制檯發起一次 SAML Request 的形式是這樣的:

GET https://core。authing。cn/v2/api/saml-idp/5e10927e4ecfd464fb4edaf6?SAMLRequest=fZJLT%2BMwFIX3%2FIrI%2B7yct9Wk6kyFQGJERQKL2RnnJnWV2Blfp2L%2BPaGlDLOApaV7vnN0jlfrl3FwjmBQalWS0AuIA0roVqq%2BJI%2FNtZuTdXW1Qj4OdGKb2e7VA%2FyZAa2zQQRjF91PrXAewdRgjlLA48NdSfbWTsh8H2WvpPL4IP%2FOyhN69N9Qfl3fE2e7UKTi9mR9EQhtwOOLz5LAE8o%2FUp9P8qRyZTv5CYRBQTOIQXRtnMbdcwwt71LiXGsj4JSwJB0fEIhzuy0Jp9AXgvaHgwzzPA%2FjfXagbRYlebeP%2BmI5wh1HlEf4J0Oc4Vah5cqWhAY0cIPCpXkTRiwoWJJ5eZH%2BJs7OaKuFHn5IdS5sNoppjhKZ4iMgs4LVm193jHoBez4fIbtpmp27u68b4jxdiqdvxS9TKGTnqr9nTe%2FGpDovw06JzWfC9wB%2B2Y5UXy8VRlmcpkWUpUlGY5p8TLfyP7tW78%2F%2Fv0f1Cg%3D%3D

(提示:程式碼可向右滑動)

SAMLRequest 引數透過 query 在 URL 中傳送給 IdP,SAMLRequest 的內容如下:

fZJLT+MwFIX3/IrI+7yct9Wk6kyFQGJERQKL2RnnJnWV2Blfp2L+PaGlDLOApaV7vnN0jlfrl3FwjmBQalWS0AuIA0roVqq+JI/NtZuTdXW1Qj4OdGKb2e7VA/yZAa2zQQRjF91PrXAewdRgjlLA48NdSfbWTsh8H2WvpPL4IP/OyhN69N9Qfl3fE2e7UKTi9mR9EQhtwOOLz5LAE8o/Up9P8qRyZTv5CYRBQTOIQXRtnMbdcwwt71LiXGsj4JSwJB0fEIhzuy0Jp9AXgvaHgwzzPA/jfXagbRYlebeP+mI5wh1HlEf4J0Oc4Vah5cqWhAY0cIPCpXkTRiwoWJJ5eZH+Js7OaKuFHn5IdS5sNoppjhKZ4iMgs4LVm193jHoBez4fIbtpmp27u68b4jxdiqdvxS9TKGTnqr9nTe/GpDovw06JzWfC9wB+2Y5UXy8VRlmcpkWUpUlGY5p8TLfyP7tW78//v0f1Cg==

(提示:程式碼可向右滑動)

base64 decode + inflate 解碼後

(https://www。samltool。com/decode。php)

<?xml version=

“1。0”

encoding=

“UTF-8”

?>

“https://signin。aliyun。com/saml/SSO”

Destination=

“https://core。authing。cn/v2/api/saml-idp/5e10927e4ecfd464fb4edaf6”

ForceAuthn=

“false”

ID=

“a2eg9c2gjji188814h7j2d7358fh3g9”

IsPassive=

“false”

IssueInstant=

“2020-09-28T13:09:57。896Z”

ProtocolBinding=

“urn:oasis:names:tc:SAML:2。0:bindings:HTTP-POST”

Version=

“2。0”

xmlns:saml2p=

“urn:oasis:names:tc:SAML:2。0:protocol”

>

xmlns:saml2=

“urn:oasis:names:tc:SAML:2。0:assertion”

>https://signin。aliyun。com/1374669376572425/saml/SSO

(提示:程式碼可向右滑動)

SAML Response

IdP 收到 SAML Request 後,會彈出登入框對使用者身份進行認證:

乾貨|理解 SAML2 協議

當用戶在 IdP 完成登入後,SAML IdP 將使用者身份斷言傳送給 SP(放在表單中,透過瀏覽器 POST 請求傳送)。SAML IdP 的響應內容如下:

“saml-form”

method=

“post”

action=

“https://signin。aliyun。com/saml/SSO”

autocomplete=

“off”

>

type

=

“hidden”

name=

“SAMLResponse”

id=

“saml-response”

value=

“PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJfNjJiMTc3YzEtYTkxOS00MmY2LTk1ODYtNDdmMTNiNzEwODFmIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAyMC0wOS0yOFQxMzozMDozMS43ODhaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9zaWduaW4uYWxpeXVuLmNvbS9zYW1sL1NTTyIgSW5SZXNwb25zZVRvPSJhNDlmOGVkaTMxY2owYTJhNDU5ZzAzMzFjM2Q5YzEwIj4KICA8c2FtbDpJc3N1ZXI+aHR0cHM6Ly8yMG5xdWx2b3FwYnAuYXV0aGluZy5jbjwvc2FtbDpJc3N1ZXI+CiAgPHNhbWxwOlN0YXR1cz4KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4KICA8L3NhbWxwOlN0YXR1cz4KICA8c2FtbDpBc3NlcnRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0iX2ZhZTk1YjQ3LWNiZjMtNGEyMC1hZGQwLTk5ZDg1NmI0MTI0ZSIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMjAtMDktMjhUMTM6MzA6MzEuNzg4WiI+CiAgICA8c2FtbDpJc3N1ZXI+aHR0cHM6Ly8yMG5xdWx2b3FwYnAuYXV0aGluZy5jbjwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+PGRzOlJlZmVyZW5jZSBVUkk9IiNfZmFlOTViNDctY2JmMy00YTIwLWFkZDAtOTlkODU2YjQxMjRlIj48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+PC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkczpEaWdlc3RWYWx1ZT4vb2w2bEMxaitzbWRvbmw0OCtsSlR6VWVxbnc9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8+PGRzOlNpZ25hdHVyZVZhbHVlPmF3emNFMGRwOEJ6VFc0YjRQRmFSWDdOS09DOTViTHFPblBlQUtJL0NzRGZHYUpkbXpDSzBmVmxpeitlNlh6Qmx1S2ZCcFF0clFvbktsN2sydlZOYVBGeDlQcFNWendLOTFITEd2WVEwcUIzNnVBNEhGdm0vM00zMURMM1pSRlBScTY4WmFWQUc2bE1WZDBZYmlJblZ2OUZXd3NpKzZqRXBGK1BSbG1rb3FBST08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNRakNDQWF1Z0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRMEZBREErTVFzd0NRWURWUVFHRXdKMWN6RVNNQkFHQTFVRUNBd0o1THFMNWE2ZTVMaUtNUXd3Q2dZRFZRUUtEQU56YzNNeERUQUxCZ05WQkFNTUJITnpjM013SGhjTk1qQXdNVEF6TVRNeE9ERTBXaGNOTWpFd01UQXlNVE14T0RFMFdqQStNUXN3Q1FZRFZRUUdFd0oxY3pFU01CQUdBMVVFQ0F3SjVMcUw1YTZlNUxpS01Rd3dDZ1lEVlFRS0RBTnpjM014RFRBTEJnTlZCQU1NQkhOemMzTXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTU5XbE1rNEwrVGNXd3lkOXBsVFBMaEhML1VNQ1BHSmd2NVZwOHZhQXA0V01zR3R3T0xJMVVOV2NjSXFNZVUwS2FzSnFyS3hIWXZxOUp6Wmg0ZmZ0Rm1vd0J6MzZ2ejBlSVVzUDVQS3ZGVUxrQzF2anJkbitRSlhiSjUxYWxaWktmUGdsMUhJOHc2bGgxMmFXVGphS1ErS2VtSXR0cUxxSmdMV09ZQVhQSXN6QWdNQkFBR2pVREJPTUIwR0ExVWREZ1FXQkJUVDEwNGhWWVZuUHBnN2FGckRpWFBTaGJ0eFVUQWZCZ05WSFNNRUdEQVdnQlRUMTA0aFZZVm5QcGc3YUZyRGlYUFNoYnR4VVRBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCRFFVQUE0R0JBQjYrMXhLN0dNSmE1TTZVamcvd2Q0RXR3eThOZFRGNnlwU3FOMzZCZDVPZFBtd1U5SHpEdUdqS2kzWndvb1BJR1JCOHBpTHNLazExTTRJaEFGNEMyUi9Kc3ZWWXdXT1lnb2pXNEgxaFI1d2syam43cGx0V3FSUGRmWkJsMFlmc0R5c1VQN2s4L01jaE9XWDdXaWZOeHBlM0dkU0tOMTdDa2RSakw5MjRiVjBsPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+CiAgICA8c2FtbDpTdWJqZWN0PgogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDp1bnNwZWNpZmllZCI+eWV6dXdlaUBhdXRoaW5nLm9uYWxpeXVuLmNvbTwvc2FtbDpOYW1lSUQ+CiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9IjIwMjAtMDktMjhUMTQ6MzA6MzEuNzg4WiIgUmVjaXBpZW50PSJodHRwczovL3NpZ25pbi5hbGl5dW4uY29tL3NhbWwvU1NPIiBJblJlc3BvbnNlVG89ImE0OWY4ZWRpMzFjajBhMmE0NTlnMDMzMWMzZDljMTAiLz4KICAgICAgPC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWw6U3ViamVjdD4KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIwLTA5LTI4VDEzOjMwOjMxLjc4OFoiIE5vdE9uT3JBZnRlcj0iMjAyMC0wOS0yOFQxNDozMDozMS43ODhaIj4KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4KICAgICAgICA8c2FtbDpBdWRpZW5jZT5odHRwczovL3NpZ25pbi5hbGl5dW4uY29tLzEzNzQ2NjkzNzY1NzI0MjUvc2FtbC9TU088L3NhbWw6QXVkaWVuY2U+CiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPgogICAgPC9zYW1sOkNvbmRpdGlvbnM+PHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIwLTA5LTI4VDEzOjMwOjMxLjg4OFoiIFNlc3Npb25JbmRleD0ib29ldW1jcTZlSGpkZHIxSDNGeXpvdTdDcy1PR1RzTmwiPjxzYW1sOkF1dGhuQ29udGV4dD48c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3Nlczp1bnNwZWNpZmllZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWw6QXV0aG5Db250ZXh0Pjwvc2FtbDpBdXRoblN0YXRlbWVudD48c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PHNhbWw6QXR0cmlidXRlIE5hbWU9ImVtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnllenV3ZWlAYXV0aGluZy5jbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJuYW1lIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciLz48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJ1c2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj55ZXp1d2VpQGF1dGhpbmcuY248L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0icGhvbmUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+bnVsbDwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PC9zYW1sOkFzc2VydGlvbj4KPC9zYW1scDpSZXNwb25zZT4=”

/>

type

=

“hidden”

name=

“RelayState”

id=

“relay-state”

value=

“”

/>

type

=

“text/javascript”

>

function

() {

document。forms[0]。submit();

})();

(提示:程式碼可向右滑動)

沒有什麼神秘的,就是一個 HTML form 表單和一段立即提交該表單的 JS 程式碼。其中的 SAML Response 資訊如下:

base64 decode + inflate 解碼後

(https://www。samltool。com/decode。php)

xmlns:samlp=

“urn:oasis:names:tc:SAML:2。0:protocol”

xmlns:saml=

“urn:oasis:names:tc:SAML:2。0:assertion”

ID=

“_62b177c1-a919-42f6-9586-47f13b71081f”

Version=

“2。0”

IssueInstant=

“2020-09-28T13:30:31。788Z”

Destination=

“https://signin。aliyun。com/saml/SSO”

InResponseTo=

“a49f8edi31cj0a2a459g0331c3d9c10”

>

https://20nqulvoqpbp。authing。cn

“urn:oasis:names:tc:SAML:2。0:status:Success”

/>

xmlns:xsi=

“http://www。w3。org/2001/XMLSchema-instance”

xmlns:xs=

“http://www。w3。org/2001/XMLSchema”

xmlns:saml=

“urn:oasis:names:tc:SAML:2。0:assertion”

ID=

“_fae95b47-cbf3-4a20-add0-99d856b4124e”

Version=

“2。0”

IssueInstant=

“2020-09-28T13:30:31。788Z”

>

https://20nqulvoqpbp。authing。cn

xmlns:ds=

“http://www。w3。org/2000/09/xmldsig#”

>

“http://www。w3。org/2001/10/xml-exc-c14n#”

/>

“http://www。w3。org/2000/09/xmldsig#rsa-sha1”

/>

“#_fae95b47-cbf3-4a20-add0-99d856b4124e”

>

“http://www。w3。org/2000/09/xmldsig#enveloped-signature”

/>

“http://www。w3。org/2001/10/xml-exc-c14n#”

/>

“http://www。w3。org/2000/09/xmldsig#sha1”

/>

/ol6lC1j+smdonl48+lJTzUeqnw=

awzcE0dp8BzTW4b4PFaRX7NKOC95bLqOnPeAKI/CsDfGaJdmzCK0fVliz+e6XzBluKfBpQtrQonKl7k2vVNaPFx9PpSVzwK91HLGvYQ0qB36uA4HFvm/3M31DL3ZRFPRq68ZaVAG6lMVd0YbiInVv9FWwsi+6jEpF+PRlmkoqAI=

MIICQjCCAaugAwIBAgIBADANBgkqhkiG9w0BAQ0FADA+MQswCQYDVQQGEwJ1czESMBAGA1UECAwJ5LqL5a6e5LiKMQwwCgYDVQQKDANzc3MxDTALBgNVBAMMBHNzc3MwHhcNMjAwMTAzMTMxODE0WhcNMjEwMTAyMTMxODE0WjA+MQswCQYDVQQGEwJ1czESMBAGA1UECAwJ5LqL5a6e5LiKMQwwCgYDVQQKDANzc3MxDTALBgNVBAMMBHNzc3MwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMNWlMk4L+TcWwyd9plTPLhHL/UMCPGJgv5Vp8vaAp4WMsGtwOLI1UNWccIqMeU0KasJqrKxHYvq9JzZh4fftFmowBz36vz0eIUsP5PKvFULkC1vjrdn+QJXbJ51alZZKfPgl1HI8w6lh12aWTjaKQ+KemIttqLqJgLWOYAXPIszAgMBAAGjUDBOMB0GA1UdDgQWBBTT104hVYVnPpg7aFrDiXPShbtxUTAfBgNVHSMEGDAWgBTT104hVYVnPpg7aFrDiXPShbtxUTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4GBAB6+1xK7GMJa5M6Ujg/wd4Etwy8NdTF6ypSqN36Bd5OdPmwU9HzDuGjKi3ZwooPIGRB8piLsKk11M4IhAF4C2R/JsvVYwWOYgojW4H1hR5wk2jn7pltWqRPdfZBl0YfsDysUP7k8/MchOWX7WifNxpe3GdSKN17CkdRjL924bV0l

“urn:oasis:names:tc:SAML:1。1:nameid-format:unspecified”

>yezuwei@authing。onaliyun。com

“urn:oasis:names:tc:SAML:2。0:cm:bearer”

>

“2020-09-28T14:30:31。788Z”

Recipient=

“https://signin。aliyun。com/saml/SSO”

InResponseTo=

“a49f8edi31cj0a2a459g0331c3d9c10”

/>

“2020-09-28T13:30:31。788Z”

NotOnOrAfter=

“2020-09-28T14:30:31。788Z”

>

https://signin。aliyun。com/1374669376572425/saml/SSO

“2020-09-28T13:30:31。888Z”

SessionIndex=

“ooeumcq6eHjddr1H3Fyzou7Cs-OGTsNl”

>

urn:oasis:names:tc:SAML:2。0:ac:classes:unspecified

“email”

NameFormat=

“urn:oasis:names:tc:SAML:2。0:attrname-format:basic”

>

xmlns:xs=

“http://www。w3。org/2001/XMLSchema”

xmlns:xsi=

“http://www。w3。org/2001/XMLSchema-instance”

xsi:

type

=

“xs:string”

>yezuwei@authing。cn

“name”

NameFormat=

“urn:oasis:names:tc:SAML:2。0:attrname-format:basic”

>

xmlns:xs=

“http://www。w3。org/2001/XMLSchema”

xmlns:xsi=

“http://www。w3。org/2001/XMLSchema-instance”

xsi:

type

=

“xs:string”

/>

“username”

NameFormat=

“urn:oasis:names:tc:SAML:2。0:attrname-format:basic”

>

xmlns:xs=

“http://www。w3。org/2001/XMLSchema”

xmlns:xsi=

“http://www。w3。org/2001/XMLSchema-instance”

xsi:

type

=

“xs:string”

>yezuwei@authing。cn

“phone”

NameFormat=

“urn:oasis:names:tc:SAML:2。0:attrname-format:basic”

>

xmlns:xs=

“http://www。w3。org/2001/XMLSchema”

xmlns:xsi=

“http://www。w3。org/2001/XMLSchema-instance”

xsi:

type

=

“xs:string”

>null

(提示:程式碼可向右滑動)

這段內容就是使用者的身份斷言,也就是使用者的 Token,只不過這個 Token 透過 XML 格式傳遞。

讀到這裡,你可能會對 SP、IdP 如何處理這些冗長的 XML 資訊感到困惑。Authing 會解決這些繁瑣的處理,而你只需關注如何正確地配置 Authing IdP,與 SAML SP 進行通訊。

02

SAML2 流程

本文為讀者講述 SAML 中,SP、IdP、瀏覽器三個實體之間資料互動的流程。

SAML 協議中涉及到的主體

使用 SAML 協議進行身份認證時,涉及到以下三個主體

瀏覽器:SP 和 IdP 藉助瀏覽器互相通訊

SP:資源提供方

IdP:身份認證提供方

發起 SAML 登入到登入成功的整個過程

乾貨|理解 SAML2 協議

使用者試圖登入 SP 提供的應用。

SP 生成 SAML Request,透過瀏覽器重定向,向 IdP 傳送 SAML Request。

IdP 解析 SAML Request 並將使用者重定向到認證頁面。

使用者在認證頁面完成登入。

IdP 生成 SAML Response,透過對瀏覽器重定向,向 SP 的 ACS 地址返回 SAML Response,其中包含 SAML Assertion 用於確定使用者身份。

SP 對 SAML Response 的內容進行檢驗。

使用者成功登入到 SP 提供的應用。

SP 與 IdP 之間通訊方式

SP 與 IdP 之間的通訊方式分為 HTTP Redirect Binding、HTTP POST Binding、HTTP Artifact Binding。每種方式在不同的階段會用不同型別的 HTTP 與對方通訊。

HTTP Redirect Binding

SP 透過重定向 GET 請求把 SAML Request 傳送到 IdP,IdP 透過立即提交的 Form 表單以 POST 請求的方式將 SAML Response 發到 SP。

乾貨|理解 SAML2 協議

HTTP POST Binding

IdP 透過立即提交的 Form 表單以 POST 請求的方式將 SAML Request 發到 SP。IdP 透過立即提交的 Form 表單以 POST 請求的方式將 SAML Response 發到 SP。

乾貨|理解 SAML2 協議

HTTP Artifact Binding

SP、IdP 雙方只通過瀏覽器交換 SAML Request、SAML Response 的索引編號,收到編號後,在後端請求對方的 Artifact Resolution Service 介面來獲取真正的請求實體內容。從而避免 SAML Request、SAML Response 暴露在前端。

乾貨|理解 SAML2 協議

乾貨|理解 SAML2 協議

關於 Authing

Authing 是國內首款以開發者為中心的全場景身份雲產品,為企業和開發者提供完善安全的使用者認證和訪問管理服務。作為雲原生架構下的身份雲產品,Authing 在產品建立初期,目標就是服務億級的企業和個人開發者客戶,輕量級、易部署、低消耗、技術棧成熟,運維易的雲原生技術產品架構,成為了 Authing 的首選。

乾貨|理解 SAML2 協議