SAML シングルサインオンフロー
SAML (Security Assertion Markup Language) でシングルサインオン (SSO) を設定すると、サービスプロバイダーまたは ID プロバイダーからログインを開始できます。サービスプロバイダーの起動によるログインと ID プロバイダーの起動によるログインでは、それぞれ異なるフローを使用しますが、どちらもユーザーはサービスプロバイダーにログインします。
必要なエディション
| 使用可能なインターフェース: Salesforce Classic および Lightning Experience の両方 |
| 使用可能なエディション: Developer Edition、Enterprise Edition、Performance Edition、Unlimited Edition、および Database.com Edition |
| 必要なユーザー権限 | |
|---|---|
| ID プロバイダーとサービスプロバイダーの定義と変更 | 「アプリケーションのカスタマイズ」 |
SAML セキュリティ
これらの SSO フローのしくみを理解するには、プロバイダーが SAML を使用してセキュリティ情報をやりとりする方法を理解することが重要です。
どちらの SAML SSO フローバリエーションでも、ID プロバイダーがユーザーを認証し、ユーザーが本人であることを確認します。ID プロバイダーは、ユーザーを認証した後、SAML 応答を使用して、ユーザーが誰であり、何を許可されているかをサービスプロバイダーに通知します。ユーザーの ID に関する情報は、応答の特定の部分 (SAML アサーション) に保存します。
サービスプロバイダーが SAML 応答を Trust できることを示すために、ID プロバイダーは応答ボディ、アサーション、またはその両方に署名します。レスポンスボディとアサーションのどちらに署名するかは、ID プロバイダーによって異なります。
- Salesforce を ID プロバイダーとして使用している場合、Salesforce は SAML レスポンスボディとアサーションに署名します。
- サードパーティ ID プロバイダーを使用している場合は、ID プロバイダーが SAML 応答に署名する方法を確認してください。
サービスプロバイダーは SAML 応答を受信すると、この署名を検証します。署名の検証方法は、サービスプロバイダーによって異なります。
- Salesforce を ID プロバイダーとして使用している場合は、サービスプロバイダーに署名の検証方法を確認してください。Salesforce はレスポンスボディとアサーションに署名するため、さまざまなサービスプロバイダーと互換性があります。
- Salesforce をサービスプロバイダーとして使用している場合、Salesforce はレスポンスボディまたはアサーションのいずれかで署名を検証できます。Salesforce は最初にレスポンスボディの署名を検索します。応答署名が欠落しているか無効である場合、Salesforce は SAML アサーションで署名を検証します。攻撃者がユーザーのブラウザーから SAML 応答を取得して応答本文を改ざんしたとしても、アサーション署名が無傷である限り、SSO ログインが危険にさらされることはありません。
ID プロバイダーがセキュリティを強化するために暗号化された SAML アサーションをサポートしている場合は、これらのアサーションを復号化および検証するように Salesforce を設定することもできます。
サービスプロバイダーの起動による SAML フロー
サービスプロバイダーの起動によるフローでは、サービスプロバイダーが ID プロバイダーに対する SAML 要求によってログインプロセスを開始します。このフローは次のように機能します。
- ユーザーは、サービスプロバイダーで保護されているリソースにアクセスするための安全なセッションを要求します。たとえば、サービスプロバイダーでフォームに記入するためのリンクをクリックします。しかし、フォームは保護されているリソースであるため、ログインしなければアクセスできません。
- サービスプロバイダーは、ID プロバイダーに SAML 要求を送信してユーザーの認証を依頼することでログインを開始します。
- ID プロバイダーはユーザーをログインページに転送します。
- ユーザーは ID プロバイダーのログイン情報を入力し、ID プロバイダーはユーザーを認証します。
- ID プロバイダーは、ユーザーの身元を確認し、暗号で署名された SAML 応答をサービスプロバイダーに送信します。SAML 応答には、サービスプロバイダーにユーザーの身元を通知する SAML アサーションが含まれます。
- サービスプロバイダーは、SAML 応答に含まれる署名を検証して、ユーザーを識別します。
- ユーザーは、サービスプロバイダーにログインして、保護されているリソースにアクセスできます。
ID プロバイダーの起動による SAML フロー
ID プロバイダーの起動によるログインフローでは、ID プロバイダーが SAML 応答でフローを開始するため、SAML 要求は不要です。ID プロバイダーの起動によるフローは、サービスプロバイダーの起動によるフローの短いバージョンです。このフローは次のように機能します。
- ユーザーは、ID プロバイダーにログインします。
- ユーザーは、サービスプロバイダーにアクセスするためのボタンまたはリンクをクリックします。たとえば、ユーザーは Salesforce 組織の [アプリケーションランチャー] ページでアプリケーションをクリックします。
- ID プロバイダーは、暗号で署名された SAML 応答をサービスプロバイダーに送信することでログインを開始します。SAML 応答には、サービスプロバイダーにユーザーの身元を通知する SAML アサーションが含まれます。
- サービスプロバイダーは、SAML 応答に含まれる署名を検証して、ユーザーを識別します。
- ユーザーは、Service プロバイダーにログインします。
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 要求を送信した後に ID プロバイダーが SAML 応答を送信します。ID プロバイダーの起動によるフローでは、ID プロバイダーが 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>
