ログイン (AuthnRequest) プロセスフロー
SAML 2.0 は、Web ブラウザで ID プロバイダー (IdP)、サービスプロバイダー (SP)、プリンシパル (ユーザー) の間で情報を交換する Web ブラウザ SSO プロファイルを指定します。
ID プロバイダーは、SAML 認証サービスを提供する任意の SSO サービス (SSOCircle など) にすることができます。サービスプロバイダーは常にインスタンスです。メッセージフローは、サービスプロバイダーの保護されたリソースの要求から始まります。
SP でのターゲットリソースの要求
プリンシパルは、サービスプロバイダーでターゲットリソースを要求します。
https://instance.service-now.com/
インスタンスは要求を確認して、SAMLRequest および RelayState URL パラメーターが存在するかどうかを把握します。存在する場合、ユーザーは IdP で既に検証済みであるため、ステップ 2 〜 6 をスキップできます。
ID プロバイダーに AuthnRequest を発行
インスタンスは、SAMLRequest 値を使用して IdP に送信される AuthnRequest を作成します。インスタンスは、さらに RelayState URL パラメーター値も作成して送信します。
RelayState トークンは、サービスプロバイダーで維持されるステータス情報への不透過型参照です。SAMLRequest パラメーターの値は、<samlp:AuthnRequest> 要素を縮小した base64 エンコード値です。<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_1" Version="2.0" IssueInstant="2004-12-05T09:21:59Z" AssertionConsumerServiceIndex="0"><saml:Issuer>https://sp.example.com/SAML2</saml:Issuer><samlp:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/></samlp:AuthnRequest>その後、統合は <samlp:AuthnRequest> 要素を URL エンコードし、それを SAMLRequest URL パラメーターとして送信します。
SSO サービスは、URL デコード、base64 デコード、拡張の順に <samlp:AuthnRequest> 要素を処理します。次に、セキュリティチェックを実行します。ユーザーが有効なセキュリティコンテキストを持っていない場合、IdP はログイン資格情報を要求してユーザーを識別します。ユーザーがすでにログインしている場合、IdP は単に SAMLResponse<tt> および <tt>RelayState URL パラメーターで応答します (ステップ 3 を参照)。
SAMLResponse と RelayState での応答
<formmethod="post"action="https://instance.service-now.com/navpage.do" ...><input type="hidden" name="SAMLResponse" value="response ..." /><input type="hidden" name="RelayState" value="token ..." />
...
<input type="submit" value="Submit" /></form>RelayState パラメーターの値はこのステップから取得されます。SAMLResponse パラメーターの値は、次の <samlp:Response> 要素の base64 エンコードです。<samlp:Responsexmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="s2cdc74f37f923e26fe1aeec42b70a93d24230334f" InResponseTo="90AA6073F01567BFB0DF194F596314E2" Version="2.0" IssueInstant="2010-04-29T23:21:51Z" Destination="https://dloomac.service-now.com/navpage.do"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://idp.ssocircle.com</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:StatusCode></samlp:Status><saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="s23e536bfc51b8487d4d3299dec162d9c2e338823b" IssueInstant="2010-04-29T23:21:51Z" Version="2.0"><saml:Issuer>http://idp.ssocircle.com</saml:Issuer><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
</Signature><saml:Subject><saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" NameQualifier="http://idp.ssocircle.com" SPNameQualifier="https://dloomac.service-now.com/navpage.do">david.loo@service-now.com</saml:NameID><saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml:SubjectConfirmationData InResponseTo="90AA6073F01567BFB0DF194F596314E2" NotOnOrAfter="2010-04-29T23:31:51Z" Recipient="https://dloomac.service-now.com/navpage.do" /></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore="2010-04-29T23:11:51Z" NotOnOrAfter="2010-04-29T23:31:51Z"><saml:AudienceRestriction><saml:Audience>https://dloomac.service-now.com</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant="2010-04-29T23:21:51Z" SessionIndex="s2dbf89ab99001e0e8cdaed67266d9d4b21b968a04"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement></saml:Assertion></samlp:Response>SAMLResponse の検証
SAMLResponse の値は base64 でデコードされて拡張され、ステップ 3 の XML ドキュメントが表示されます。ログインスクリプトは //Subject/NameID 要素から XML 値を抽出し、それを使用してユーザーテーブルで既存のユーザーを検索します。
ログインスクリプトは、//AuthnStatement/@SessionIndex 要素からセッション ID を抽出し、LogoutRequest 用に格納します。