SAML
如果您使用基於 SAML 的身分提供者,您可以設定 App ID 以啟動單一登入 (SSO) 體驗。 在此類流量中,App ID 作為服務供應商,為您的每月活躍使用者 (MAU) 提供安全代幣。
瞭解 SAML
「安全主張標記語言 (SAML)」是一種開放式標準,用於在主張身分的提供者和使用身分資訊的提供者之間交換鑑別和授權資料。 SAML 2.0 是以 XML 為基礎,並且是認證和授權標準的成熟框架。
SAML 通訊協定是 App ID(服務提供者)與身分提供者之間的溝通方式。 身份提供者驗證使用者時,會建立 SAML 令牌,其中包含使用者的相關資訊,例如驗證方式、與之相關的屬性或授權參數。 請參閱下表的範例。
| 資訊類型 | 範例 |
|---|---|
| 鑑別 | 使用者可以使用密碼、MFA 或其他方式進行驗證。 |
| 屬性 | 任何屬性,例如使用者所屬的群組或某種喜好設定。 |
| 授權決策 | 有時,授權某個使用者的許可權可能多於或少於其他人。 |
流程具有怎樣的外觀?
雖然 SAML 架構用於鑑別使用者,但 App ID 仍使用更先進的 OIDC 通訊協定與應用程式交換安全記號。 請參閱下列影像,以查看詳細的資訊流程。
- 使用者存取其應用程式上的登入頁面或受限資源,透過 App ID SDK 或 API 向 App ID
/authorization端點啟動請求。 如果使用者未獲授權,則會以重新導向至 App ID 來開始鑑別流程。 - App ID 產生 SAML 鑑別要求 (
AuthNRequest),並且瀏覽器會自動將使用者重新導向到 SAML 身分提供者。 - 身分提供者會剖析 SAML 要求、鑑別使用者,以及產生具有其主張的 SAML 回應。
- 身分提供者會使用 SAML 回應,將使用者及回應重新導向回 App ID。
- 如果鑑別成功,App ID 會建立代表使用者授權和鑑別的存取及身分記號,並將它們傳回給應用程式。 如果鑑別失敗,App ID 會將身分提供者錯誤碼傳回給應用程式。
- 使用者會獲授與對應用程式或受保護資源的存取權。
SSO 如何變更流程?
SSO 的工作流程與上述工作流程類似。 唯一的差別在於上一節的步驟 3。 已啟用 SSO 後,在要求使用者進行鑑別之前,身分提供者會先檢查使用者是否已經建立了鑑別階段作業。 如果是,則不會要求使用者進行鑑別,並且流程會照常繼續。 如果無法使用 SSO 階段作業,會將使用者重新導向到登入頁面。 如果您的身分提供者無法滿足用來建立 SSO 之 App ID 要求中所定義的鑑別需求,則也可能會將使用者重新導向。 例如,如果身分提供者使用生物識別建立了使用者 SSO 階段作業,必須變更
App ID 的預設鑑別。 依預設,App ID 預期使用者以密碼透過 HTTPS 進行鑑別:urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport。
瞭解主張
當 SAML 主張傳回給 App ID 時,服務會聯合使用者身分,並產生適當的記號。 如果 SAML 主張對應於其中一個標準 OIDC 宣告,會自動將其新增到身分記號。 依預設,將忽略不符合的主張。 如果您的 SAML 提供者會傳回其他斷言,就可以設定 App ID,將這些資訊注入您的代幣中。 但是,請務必不要在您的代幣中加入超過必要的資訊,因為代幣通常會以 HTTP 標頭傳送,而且數量有限。
App ID 試圖對映到主張的標準 OIDC 宣告如下:
nameemaillocalepicture
如果其中一個以上值在身分提供者端發生變更,新值在使用者重新登入後可用。
App ID 預期 SAML 主張看起來像什麼?
服務預期 SAML 主張看起來像下列範例。
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="s2202bbbbafa9d270d1c15990b738f4ab36139d463" InResponseTo="_e4a78780-35da-012e-8ea7-0050569200d8" Version="2.0" IssueInstant="2011-03-21T11:22:02Z" Destination="https://example.example.com/">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">idp_entityId</saml:Issuer>
<samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<samlp:StatusCode xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<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" Version="2.0" ID="pfx539c9774-de5c-5f52-0c3f-b1c2e2697a89" IssueInstant="2018-01-29T13:02:58Z" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Issuer>idp_entityId</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="one_of_supported_algo"/>
<ds:SignatureMethod Algorithm="one_of_supported_algo"/>
<ds:Reference URI="#pfx539c9774-de5c-5f52-0c3f-b1c2e2697a89">
<ds:Transforms>
<ds:Transform Algorithm="one_of_supported_algo"/>
<ds:Transform Algorithm="one_of_supported_algo"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="one_of_supported_algo"/>
<ds:DigestValue>huywDPPfOEGyyzE7d5hjOG97p7FDdGrjoSfes6RB19g=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>BAwNZFgWF2oxD1ux0WPfeHnzL+IWYqGhkM9DD28nI9v8XtPN8tqmIb5y4bomaYknmNpWYn7TgNO2Rn/XOq+N9fTZXO2RybaC49iF+zWibRIcNwFKCCpDL6H6jA5eqJX2YKBR+K6Yt2JPoUIRLmqdgm2lMr4Nwq1KYcSzQ/yoV5W0SN/V5t8EfctFoaXVPdtfHVXkwqHeufo+L4gobFt9NRTzXB0SQEClA1L8hQ+/LhY4l46k1D0c34iWjVLZr+ecQyubf7rekOG/R7DjWCFMTke822dR+eJTPWFsHGSPWCDDHFYqB4QMinTvUnsngjY3AssPqIOjeUxjL3p+GXn8IQ==</ds:SignatureValue>
</ds:Signature>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">JohnDoe@gmail.com</saml:NameID>
</saml:Subject>
<saml:Conditions NotBefore="2018-01-29T12:59:58Z" NotOnOrAfter="2018-01-29T13:05:58Z">
</saml:Conditions>
</samlp:Response>
App ID 支援哪些類型的演算法?
App ID 使用 RSA-SHA256 演算法來處理 XML 數位簽章。
設定 SAML 身分提供者與 App ID
您可以設定 SAML 身分提供者與 App ID 合作,方法是將 App ID 的元資料提供給您的身分提供者,並將您的身分提供者的元資料提供給 App ID。
提供 meta 資料給您的身分提供者
若要配置您的應用程式,您需要提供資訊給 SAML 相容身分提供者。 此資訊是透過 meta 資料 XML 檔案進行交換,該檔案還包含用來建立信任的配置資料。
在您將 SAML 設定為身分提供者後,才能啟用。
-
在 App ID 儀表板的管理標籤中,按一下 SAML 列中的編輯來配置您的設定。
-
按一下下載 SAML Meta 資料檔。 您的身分提供者預期來自檔案的下列資訊。
在元數據文件中找到的信息 變數 說明 EntityID讓身分提供者知道 App ID 發出 SAML 請求的識別碼。 Location URL身分提供者在順利鑑別使用者之後傳送 SAML 主張的位置。 Binding身份提供者必須如何傳送 SAML 回應的指示。 NameID Format身份提供者如何知道它需要在主體斷言中傳送哪一種識別符格式,以及 App ID 如何識別使用者。 ID 必須採用下列格式: <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">。WantAssertionsSigned身份提供者檢查是否需要簽署聲明的方式。 服務會預期主張已簽署,但不支援加密主張。 KeyDescriptorSAML 簽署憑證和加密憑證,可用於配置身分提供者驗證已簽署的 SAML 要求並加密回應。 -
提供資料給您的身分提供者。 如果您的身分提供者支援上傳 meta 資料檔,則您可以這麼做。 若非如此,請手動配置內容。 並非每個身分提供者都使用相同的內容,因此,您可能不會使用全部的內容。
身分提供者之間的內容名稱可能不同。
-
將 SAML 2.0 聯合切換至已啟用。
提供 meta 資料給 App ID
您可以從身分提供者取得資料,並將其提供給 App ID。 您可以從 IBM Cloud 或您的身分提供者起始登入應用程式。
在主控台中提供元資料
若要從 IBM Cloud 使用者介面登入應用程式,請遵循下列步驟。
-
導覽至 App ID 儀表板的 SAML 2.0 標籤。
-
新增 提供者名稱。 預設名稱為 SAML。
-
在提供來自 SAML IdP 的 meta 資料區段中,輸入您從身分提供者取得的下列 meta 資料。
必須提供給App ID的資訊 變數 說明 Sign-in URL將使用者重新導向以進行鑑別的 URL。 它是由您的 SAML 身分提供者進行管理。 Entity IDSAML 身分提供者的廣域唯一名稱。 Primary certificateSAML 身分提供者所發出的憑證。 它用於簽署及驗證 SAML 主張。 所有提供者都不同,但您可能可以從身分提供者下載簽署憑證。 證書必須是 .pem格式。 -
選用項目:提供在主要憑證上簽章驗證失敗時所使用的次要憑證。 如果簽署金鑰保持相同,則 App ID 不會封鎖過期憑證的鑑別。
-
按一下儲存。
想要設定鑑別環境定義嗎? 您可以透過 API 這樣做。
在主控台中設定 IdP-initiated 登入
或者,如果您想要從身分識別提供者的 UI 登入IBM Cloud上的應用程序,您可以啟用IdP-initiated登入。
遵循 在主控台中提供元數據 部分中的步驟 1 - 4。 然後,完成下列程序。
- 啟用 IdP 起始登入。
- 輸入 IdP 重定向 URL。
- 按一下儲存。
使用 API 提供元資料
-
向
/samlAPI 端點提出 GET 請求,查看您目前的 SAML 設定,包括驗證上下文和憑證。程式碼範例:
curl --request GET \ https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \ --header `Accept: application/json`輸出範例:
{ "isActive": true, "config": { "entityID": "https://example.com/saml2/metadata/706634", "signInUrl": "https://example.com/saml2/sso-redirect/706634", "certificates": [ "certificate-example-pem-format" ], "displayName": "my saml example", "authnContext": { "class": [ "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" ], "comparison": "exact" } } } -
建立 SAML 配置,方法是將下列範例中的值取代為來自提供者的資訊。 範例中顯示的值是必填的,但您可以選擇包含更多資訊,如表中所示。
"config": { "authnContext": { "class": [ "urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue", "urn:oasis:names:tc:SAML:2.0:ac:classes:YourOtherChosenClassValue" ], "comparison": "sampleComparisonValue"} "entityID": "https://example.com/saml2/metadata/706634", "signInUrl": "https://example.com/saml2/sso-redirect/706634", "certificates": [ "primary-certificate-example-pem-format" "secondary-certificate-example-pem-format" ], "displayName": "my saml example", "signRequest": true , "encryptResponse": true }SAML 組態變數 變數 說明 signInUrl將使用者重新導向以進行鑑別的 URL。 它是由您的 SAML 身分提供者進行管理。 entityIDSAML 身分提供者的廣域唯一名稱。 displayName指派給 SAML 配置的名稱。 primary-certificate-example-pem-formatSAML 身分提供者所發出的憑證。 它用於簽署及驗證 SAML 主張。 所有提供者都不同,但您可能可以從身分提供者下載簽署憑證。 證書必須是 .pem格式。選購: secondary-certificate-example-pem-format由 SAML 身份提供者簽發的備份憑證。 它用於無法使用主要憑證驗證簽章的情況。 注意:如果簽章金鑰保持不變,App ID 就不會攔截過期憑證的驗證。 選購: authnContext鑑別環境定義是用來驗證鑑別及 SAML 主張的品質。 您可以將類別陣列和比較字串新增至您的程式碼,以新增鑑別環境定義。 請務必使用您的值同時更新 class及comparison參數。 例如,class參數可能與urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue相似。選購: signRequestsignRequest標誌提供向身分提供者傳送經簽署的 SAML 請求的能力,該請求是使用租戶的 SAML 簽署私密金鑰簽署的。 若要設定 SAML 身份提供者以接收已簽署的請求,您需要從元資料檔案中取得簽署憑證,您可在KeyDescriptor use="signing"欄位下載該憑證。 依預設,要求簽署設為off。選購: encryptResponseencryptResponse標誌允許您接收身份供應商的加密回應,作為驗證請求的一部分。 要設定 SAML 身份提供者傳送加密回應,您需要在KeyDescriptor use="encryption"欄位的元資料檔案中找到加密證書。 依預設,回應加密設為off。 -
向
/samlAPI 端點提出 PUT 請求,將您在步驟 2 中建立的設定提供給 App ID。 請參閱下列範例,以瞭解要求可能的外觀。curl --request PUT \ https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \ --header `Accept: application/json` \ --data \ { "isActive": true, "config": { "entityID": "https://example.com/saml2/metadata/706634", "signInUrl": "https://example.com/saml2/sso-redirect/706634", "certificates": [ "primary-certificate-example-pem-format" ], "displayName": "my saml example", } }
使用 API 設定IdP-initiated登入
若要設定 IdP-initiated 登入,請完成下列步驟。
-
向
/samlAPI 端點提出 GET 請求,查看您目前的 SAML 設定,包括驗證上下文和憑證。程式碼範例:
curl --request GET \ https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \ --header `Accept: application/json`輸出範例:
{ "isActive": true, "config": { "entityID": "https://example.com/saml2/metadata/706634", "signInUrl": "https://example.com/saml2/sso-redirect/706634", "certificates": [ "certificate-example-pem-format" ], "displayName": "my saml example", "authnContext": { "class": [ "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" ], "comparison": "exact" } } } -
建立 SAML 配置,方法是將下列範例中的值取代為來自提供者的資訊。 範例中顯示的值是必填的,但您可以選擇包含更多資訊,如表中所示。
"config": { "authnContext": { "class": [ "urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue", "urn:oasis:names:tc:SAML:2.0:ac:classes:YourOtherChosenClassValue" ], "comparison": "sampleComparisonValue" }, "idpInitEnabled": true, "idpRedirectUrl": "https://example.com/redirect/endpoint", "entityID": "https://example.com/saml2/metadata/706634", "signInUrl": "https://example.com/saml2/sso-redirect/706634", "certificates": [ "primary-certificate-example-pem-format" "secondary-certificate-example-pem-format" ], "displayName": "my saml example", "signRequest": true , "encryptResponse": true }SAML 組態變數 變數 說明 signInUrl將使用者重新導向以進行鑑別的 URL。 它是由您的 SAML 身分提供者進行管理。 entityIDSAML 身分提供者的廣域唯一名稱。 displayName指派給 SAML 配置的名稱。 primary-certificate-example-pem-formatSAML 身分提供者所發出的憑證。 它用於簽署及驗證 SAML 主張。 所有提供者都不同,但您可能可以從身分提供者下載簽署憑證。 證書必須是 .pem格式。DefaultRelayStateRelayState的起始值。 此變數在您身分提供者的設定中配置。 在 SAML 請求時,這個變數可以用來重定向 URL,而不是idpRedirectUrl。 如果您同時設定這兩個變數,則DefaultRelayState的值優先。 IdP-initiated 如果您沒有設定其中一個變數,登入就會失敗。idpInitEnabled布林值,指出是否要啟用 IdP 起始登入。 idpRedirectUrl此欄位的值可以是 null、為空的字串,或是有效的 http 或 https 重定向 URL。 注意:如果此欄位的值為空,則必須設定DefaultRelayState為重定向 URL。 如果您同時設定這兩個變數,則DefaultRelayState的值優先。 IdP-initiated 如果您沒有設定其中一個變數,登入就會失敗。選購: secondary-certificate-example-pem-format由 SAML 身份提供者簽發的備份憑證。 它用於無法使用主要憑證驗證簽章的情況。 注意:如果簽章金鑰保持不變,App ID 就不會攔截過期憑證的驗證。 選購: authnContext鑑別環境定義是用來驗證鑑別及 SAML 主張的品質。 您可以將類別陣列和比較字串新增至您的程式碼,以新增鑑別環境定義。 請務必使用您的值同時更新 class及comparison參數。 例如,class參數可能與urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue相似。選購: signRequestsignRequest標誌提供向身分提供者傳送經簽署的 SAML 請求的能力,該請求是使用租戶的 SAML 簽署私密金鑰簽署的。 若要設定 SAML 身份提供者以接收已簽署的請求,您需要從元資料檔案中取得簽署憑證,您可在KeyDescriptor use="signing"欄位下載該憑證。 依預設,要求簽署設為off。選購: encryptResponseencryptResponse標誌允許您接收身份供應商的加密回應,作為驗證請求的一部分。 要設定 SAML 身份提供者傳送加密回應,您需要在KeyDescriptor use="encryption"欄位的元資料檔案中找到加密證書。 依預設,回應加密設為off。 -
向
/samlAPI 端點提出 PUT 請求,將您在步驟 2 中建立的設定提供給 App ID。 請參閱下列範例,以瞭解要求可能的外觀。curl --request PUT \ https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \ --header `Accept: application/json` \ --data \ { "isActive": true, "config": { "entityID": "https://example.com/saml2/metadata/706634", "signInUrl": "https://example.com/saml2/sso-redirect/706634", "certificates": [ "certificate-example-pem-format" ], "displayName": "my saml example", "authnContext": { "class": [ "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" ], "comparison": "exact" }, "idpInitEnabled": true, "idpRedirectUrl": "https://example.com/redirect/endpoint", } }
測試您的配置
您可以測試「SAML 身分提供者」與 App ID 之間的配置。
- 請確定您已儲存設定。
- 導覽至 App ID 儀表板的 SAML 2.0 標籤,然後按一下測試。 即會開啟新標籤。
- 使用身份提供者已認證的使用者登入。
- 完成表單之後,系統會將您重新導向至另一個頁面。
- 成功鑑別:App ID 與「身分提供者」之間的連線正確運作。 頁面會顯示有效的存取及身分記號。
- 失敗鑑別:連線已中斷。 頁面會顯示錯誤及 SAML 回應 XML 檔。
SAML 架構支援多種設定檔、流程和組態,這表示您的身分提供者必須正確設定。 如果您遇到問題,請查看 驗證請求可能失敗的 一些常見原因,或檢閱 SAML 規格,瞭解詳細的錯誤代碼。