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>