SAML Response の検証

IdP である LINE WORKS は SP からの認証要求メッセージを受け取ると、SAML Request を検証した後に LINE WORKS ログインページを表示します。ユーザーがログインに成功すると LINE WORKS は SAML Response を作成し SP が指定した ACS URL に送信します。SP は SAML Response を検証して SP の認証トークンを発行します。

注意

  • LINE WORKS を IdP と SP の両方として使用する場合は認証元となるサービスのログインページを表示します。

例

  1. LINE WORKS を IdP として連携サービス A を SP に登録する
  2. 連携サービス B を IdP として LINE WORKS を SP に登録する
  3. 連携サービス A からの認証要求時、連携サービス B のログインページが表示される

HTTP Request {#verify-saml-request-url}

SAML Request に指定されている ACS URL を使用します。

POST https://AuthnRequest-AssertionConsumerServiceURL

Query Parameters {#verify-saml-request-parameter}

ParameterTypeDescription
SAMLResponseString認証要求に対する応答内容 (Base64 エンコード)
required
RelayStateString認証要求時に SP が指定した RelayState 値

GET Method Request {#verify-saml-request}

注意

  • SAML Request の Protocol Binding に "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 以外を設定した場合には GET を使用し、SAMLResponse は Deflate + Base64 でエンコードされます。

SAML Response Body {#verify-saml-response-body}

<?xml version="1.0" encoding="UTF-8"?><saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"Destination="{LINE WORKS に登録した ACS URL}" ID="{LINE WORKS で発行する ID}" InResponseTo="{SAML Request に含まれる ID}" IssueInstant="{SAML Response 生成日時}"  Version="2.0">  <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">  {IdP の Provider ID}  </saml2:Issuer>  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">      "{デジタル署名}"  </Signature>  <saml2p:Status>    <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>  </saml2p:Status>  <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"  ID="{LINE WORKS で発行する ID}"  IssueInstant="{SAML Response 生成日時}"  Version="2.0">    <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">    {Response Issuer}    </saml2:Issuer>    <saml2:Subject>      <saml2:NameID Format="unspecified">      "{ログインしたユーザーの LINE WORKS ID}"      </saml2:NameID>      <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">        <saml2:SubjectConfirmationData        InResponseTo="{SAML Request に含まれた ID}"        NotOnOrAfter="{SAML Response 満了日時}"        Recipient="{ACS URL}"/>      </saml2:SubjectConfirmation>    </saml2:Subject>    <saml2:Conditions NotBefore="{SAML Response 生成日時}"    NotOnOrAfter="{SAML Response 満了日時}">      <saml2:AudienceRestriction>        <saml2:Audience>{LINE WORKS に登録した SP Issuer}        </saml2:Audience>      </saml2:AudienceRestriction>    </saml2:Conditions>    <saml2:AuthnStatement AuthnInstant="{SAML Response 生成日時}"     SessionIndex="{LINE WORKS で発行する ID}">      <saml2:AuthnContext>        <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>      </saml2:AuthnContext>    </saml2:AuthnStatement>  </saml2:Assertion></saml2p:Response>

SAML Response の各項目は下記の通りです。

ParameterTypeDescription
Response DestinationStringSAML Request に含まれる ACS URL
required
Response IDStringResponse を特定するための一意となる値
ランダム文字列
required
Response InresponseToDate(UTC)SAML Request に含まれる ID
required
Response IssueInstantDate(UTC)SAML Response 生成日時
required
SignatureStringデジタル署名
required
Assertion IDStringAssertion を特定するための一意となる値
ランダム文字列
Assertion IssueInstantDate(UTC)Assertion 生成日時
Subject NameIDStringユーザーの LINE WORKS ログイン ID (id@domain or id@group)
required
SubjectConfirmationData InResponseToStringSAML Request に含まれる ID
required
SubjectConfirmationData NotOnOrAfterDate(UTC)SAML Response 満了日時
required
SubjectConfirmationData RecipientStringACS URL
required
Conditions NotBeforeDate(UTC)SAML Response 生成日時
required
Conditions NotOnOrAfterDate(UTC)SAML Response 満了日時
required
AudienceStringSAML Request に含まれる SP の SP Issuer (Entity Id)
required
AuthnStatement AuthnInstantDate(UTC)SAML Response 生成日時
required
AuthnStatement SessionIndexStringSession を特定するための一意となる値
ランダム文字列
required

デジタル署名の検証 {#verify-signature}

注意

  • SP は、 SAML Response に含まれる Signature を、 Developer Console で発行した証明書ファイル (.pem) を用いて検証する必要があります。

SAML Response Body Example {#verify-saml-response-body-example}

<?xml version="1.0" encoding="UTF-8"?><saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://www.example.com/vendor.com/acs" ID="iikplioanoofjomkgckmmamjfipjnbcmjhindmgd" InResponseTo="akidlcfmckodoaojopljbhcaieejopdiebeelgke" IssueInstant="2018-02-27T05:42:27.614Z" Version="2.0">  <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://auth.worksmobile.com/saml2/example.com</saml2:Issuer>  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">    ...  </Signature>  <saml2p:Status>    <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>  </saml2p:Status>  <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="mojkjoofkhhfdgcajjommcnjdmclnbbibamkaojh" IssueInstant="2018-02-27T05:42:27.678Z" Version="2.0">    <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://auth.worksmobile.com/saml2/example.com</saml2:Issuer>    <saml2:Subject>      <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">dev@vendor.com</saml2:NameID>      <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">        <saml2:SubjectConfirmationData InResponseTo="akidlcfmckodoaojopljbhcaieejopdiebeelgke" NotOnOrAfter="2018-02-27T05:47:27.678Z" Recipient="https://www.example.com/vendor.com/acs"/>      </saml2:SubjectConfirmation>    </saml2:Subject>    <saml2:Conditions NotBefore="2018-02-27T05:42:27.678Z" NotOnOrAfter="2018-02-27T05:47:27.678Z">      <saml2:AudienceRestriction>        <saml2:Audience>https://example.com/sp/provider</saml2:Audience>      </saml2:AudienceRestriction>    </saml2:Conditions>    <saml2:AuthnStatement AuthnInstant="2018-02-27T05:42:27.678Z" SessionIndex="bjbgljemhimbdimmpdjcbelfeakfhdpcdmebjcna">      <saml2:AuthnContext>        <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>      </saml2:AuthnContext>    </saml2:AuthnStatement>  </saml2:Assertion></saml2p:Response>