SAML Response の検証

    LINE WORKS が SAML Request を受け取ると、これを検証した後にログインページを実行します。
    このとき、SSO を使用している場合は顧客のログインページ、非使用の場合は LINE WORKS のログインページを利用してログインします。

    ログインに成功すると SAML Response を生成し、クライアントの ACS URL に渡します。

    Request URL

    SAML Request に指定した ACS URL を使用します。
    Developer Console に登録した ACS URL と同一でなければなりません。

    HTTP Method

    SAML Request に指定した Protocol Binding により、GET または POST を使用します。
    "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" の場合は POST、それ以外は GET を使用します。

    Request

    パラメーター タイプ 必須 説明
    SAMLResponse String Y SAML 2.0 Response 明細による文字列。
    - Protocol Binding が HTTP-POST の場合: Base64 でエンコード
    - それ以外の場合: Deflate + Base64 でエンコード
    RelayState String N SP 側から渡す場合のみ Response に伝達。

    参考

    • SAML Response 内には Developer Console に登録した証明書でデジタル署名した値が含まれるため、クライアントはデジタル署名の値を検証する必要があります。

    SAML Response 明細

    <?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 の各項目は下記の通りです。

    項目 タイプ 必須 説明
    Response Destination String Y SAML Request に含まれる ACS URL 。
    Response ID String Y LINE WORKS で発行する Response を一意に特定するための値。ランダム文字列。
    Response InresponseTo Date(UTC) Y このレスポンスを要求した SAML Request の ID 。
    Response IssueInstant Date(UTC) Y SAML Response 生成日時。
    Signature String Y デジタル署名。
    Assertion ID String N LINE WORKS で発行する Assertion を一意に特定するための値。ランダム文字列。
    Assertion IssueInstant Date(UTC) N Assertion 生成日時。
    Subject NameID String Y ログインしたユーザーの NameID (LINE WORKS の id@domain or group)。
    SubjectConfirmationData InResponseTo String Y このレスポンスを要求した SAML Request の ID。
    SubjectConfirmationData NotOnOrAfter Date(UTC) Y SAML Response 満了日時。
    SubjectConfirmationData Recipient String Y ACS URL。
    Conditions NotBefore Date(UTC) Y SAML Response 生成日時。
    Conditions NotOnOrAfter Date(UTC) Y SAML Response 満了日時。
    Audience String Y SAML Request に含まれる SP の Issuer(Provider ID)。
    AuthnStatement AuthnInstant Date(UTC) Y SAML Response 生成日時。
    AuthnStatement SessionIndex String Y LINE WORKS で発行する Session を一意に特定するための値。ランダム文字列。

    SAML Response 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>