Sun ONE Identity Server 配備ガイド |
付録 B
ユーザーセッションのライフサイクルSunTM ONE Identity Server では、アクセス管理サービスを提供する際、複数の HTTP (HyperText Transfer Protocol) 要求にまたがる、ユーザーと Web アプリケーションとの対話処理の追跡に使用するセッションオブジェクトを作成できます。この章では、Identity Server コンポーネントのプロトコルのやり取りを追跡して、セッションのライフサイクルについて説明します。次の節で構成されています。
概要以降のセクションでは、Web ブラウザを使用して保護されたリソースへのアクセスを要求するユーザーに認証および承認サービスを提供する際の、Identity Server コンポーネントのプロトコルのやり取りを追跡します。これにより、セッションのライフサイクルの様子を理解できます。
要求最初に、認証されていないユーザーが保護されたリソースに対する要求を作成します。この要求はサーバーに送信されます。リソースは、ポリシーエージェントにより保護されています。コード例 5-3 に、ブラウザから送信される GET 要求を示します。
Identity Server では、すべてのアクセス要求は、有効なセッショントークン (プログラムでは SSOToken) が存在することで明示的に許可されない限り、暗黙的に拒否されます。
この場合、セッショントークンは提供されないため、ポリシーエージェントは認証サービスに要求をリダイレクトします。コード例 5-4 に、要求元のブラウザに返されたリダイレクト情報を示します。これには、認証サービスへの URI、および元の要求の URL を含む goto パラメータが含まれます。
コード例 5-4 リダイレクト情報に対する GET 応答
HTTP/1.1 302 Moved Temporarily
Location: http://identityserver.sun.com:58081/amserver/UI/Login?goto=http% 3A%2F%2Fapplication.sun.com%3A8089%2Findex.html
HTTP で待機中のユーザーのブラウザによりリダイレクトが許可され、認証サービス URI への要求が実行されます。コード例 5-5 に、認証サービスに送信される GET 要求を示します。
コード例 5-5 認証サービスにリダイレクトされる GET 要求
GET /amserver/UI/Login?goto=http%3A%2F%2Fapplication.sun.com%3A8089% 2Findex.html HTTP/1.1
Host: identityserver.sun.com:58081
認証認証要求の受信時に、認証サービスは、Identity Server の設定および要求パラメータに基づいて、ユーザーに提供する認証モジュールを決定します。新規の認証要求すべてと同様、ユーザーのやり取りを追跡するため、セッションサービスにより無効なセッショントークンが作成されます。(このセッショントークンには、ユーザーを表すランダムに生成された文字列である暗号化されたセッション ID も含まれます。) セッショントークンは、Cookie (デフォルトでは iPlanetDirectoryPro) 内で設定されます。認証サービスは、認証要求に応答して、適切な証明情報をユーザーに求めるフォームと共にこれを送信します。
注
フォームのプロトコル (HTML、WML など) は、認証を要求するクライアントに基づいて、クライアントディテクションサービスにより決定されます。このサービスの詳細については、『Sun ONE Identity Server Customization And API Guide』を参照してください。
コード例 5-6 に、ユーザーから認証証明情報を要求する HTML 認証フォームのヘッダーを示します。(HTML 自体は、簡略化のために削除されています。)
ユーザーは、受信したフォームに認証証明情報を入力して、Identity Server に送信します。通常、この処理は、パスワード属性を保護するために SSL 経由で行われます。理解を容易にするため、コード例 5-7 で送信される証明情報はクリア HTTP 経由で送信されています。
コード例 5-7 Identity Server に返される POST 証明情報
POST /amserver/UI/Login HTTP/1.1
Host: identityserver.sun.com:58081
Cookie: JSESSIONID=DE271E3F2D52473B409DD8A7C58C24A5; iPlanetDirectoryPro=AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnH Aj4%3D
Content-Type: application/x-www-form-urlencoded
IDToken1=user1&IDToken2=password
認証サービスにより受信された証明情報は、適切な認証モジュールにより検証されます。証明情報は検査に合格し、セッショントークンの状態は有効に変更され、セッション情報 (ログイン時刻、認証方式、認証レベルなど) は保存されるものとします。iPlanetDirectoryPro Cookie には、有効なセッショントークンが含まれるようになります。サーバーはブラウザに対し最初に要求されたリソースへのリダイレクトで応答します。コード例 5-8 に、このリダイレクト応答を示します。
コード例 5-8 最初に要求されたリソースへのリダイレクト
HTTP/1.1 302 Moved Temporarily
Server: Sun-ONE-Web-Server/6.1
X-autherrorcode: 0
X-dsameversion: 6.1
Location: http://application.sun.com:8089/index.html
HTTP で待機中のユーザーのブラウザにより、元のリソースへのリダイレクトが許可され、その後再度アクセスが要求されます。今回は、認証プロセス中に作成されたセッショントークンが、要求に含まれます。
コード例 5-9 トークンと共にリダイレクトされる GET 要求ヘッダー
GET /index.html HTTP/1.1
Host: application.sun.com:8089
Referer: http://identityserver.sun.com:58081/amserver/UI/Login?goto=http% 3A%2F%2Fapplication.sun.com%3A8089%2Findex.html
Cookie: iPlanetDirectoryPro=AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnH Aj4%3D
セッショントークンポリシーエージェントは、要求を再び遮断します。要求には Identity Server と同じ DNS ドメイン内のセッショントークンが含まれるようになったため、エージェントはこのトークンおよび関連するセッションの有効性の判定を試みます。最初に、セッションの出所を確認する必要があります。このため、ネーミングサービスとの通信が行われます。ネーミングサービスは、Identity Server が使用する内部サービスのサービス URL をクライアントが検索することを許可します。この情報は、セッションに関する通信に使用できます。ネームサービスは、セッションを暗号化して、対応する URL を返します。この URL を使用して、適用可能なサービスからセッションに関する情報が取得されます。コード例 5-10 に、ネーミング情報の POST 要求を示します。
コード例 5-10 ネーミング情報の POST 要求
POST /amserver/namingservice HTTP/1.0
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RequestSet vers="1.0" svcid="com.iplanet.am.naming" reqid="9">
<Request><![CDATA[
<NamingRequest vers="1.0" reqid="2" sessid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=">
<GetNamingProfile>
</GetNamingProfile>
</NamingRequest>]]>
</Request>
</RequestSet>
コード例 5-11 に、ネーミング情報の POST 要求に対する応答を示します。属性名および対応する URL 値に注目してください。
コード例 5-11 ネーミング情報に関する応答
HTTP/1.1 200 OK
Content-type: text/html
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseSet vers="1.0" svcid="com.iplanet.am.naming" reqid="9">
<Response><![CDATA[<NamingResponse vers="1.0" reqid="2">
<GetNamingProfile>
<Attribute name="iplanet-am-naming-policy-url" value="http://identityserver.sun.com:58081/amserver/policyservic e"></Attribute>
<Attribute name="iplanet-am-naming-session-class" value="com.iplanet.dpro.session.service.SessionRequestHandler">< /Attribute>
<Attribute name="iplanet-am-naming-session-url" value="http://identityserver.sun.com:58081/amserver/sessionservi ce"></Attribute>
<Attribute name="iplanet-am-naming-samlawareservlet-url" value="http://identityserver.sun.com:58081/amserver/SAMLAwareSer vlet"></Attribute>
<Attribute name="serviceObjectClasses" value="iplanet-am-naming-service"></Attribute>
<Attribute name="iplanet-am-naming-auth-url" value="http://identityserver.sun.com:58081/amserver/authservice" ></Attribute>
<Attribute name="iplanet-am-naming-profile-class" value="com.iplanet.dpro.profile.agent.ProfileService"></Attribut e>
<Attribute name="iplanet-am-naming-samlassertionmanager-url" value="http://identityserver.sun.com:58081/amserver/AssertionMan agerServlet/AssertionManagerIF"></Attribute>
<Attribute name="iplanet-am-naming-umservice-url" value="http://identityserver.sun.com:58081/amserver/UserManageme ntServlet/"></Attribute>
<Attribute name="01" value="http://identityserver.sun.com:58081"></Attribute>
<Attribute name="iplanet-am-naming-policy-class" value="com.sun.identity.policy.remote.PolicyRequestHandler"></At tribute>
<Attribute name="iplanet-am-naming-logging-class" value="com.sun.identity.log.service.LogService"></Attribute>
<Attribute name="iplanet-am-naming-profile-url" value="http://identityserver.sun.com:58081/amserver/profileservi ce"></Attribute>
<Attribute name="iplanet-am-naming-samlsoapreceiver-url" value="http://identityserver.sun.com:58081/amserver/SAMLSOAPRece iver"></Attribute>
<Attribute name="iplanet-am-naming-logging-url" value="http://identityserver.sun.com:58081/amserver/loggingservi ce"></Attribute>
<Attribute name="iplanet-am-naming-fsassertionmanager-url" value="http://identityserver.sun.com:58081/amserver/FSAssertionM anagerServlet/FSAssertionManagerIF"></Attribute>
<Attribute name="iplanet-am-platform-server-list" value="http://identityserver.sun.com:58081"></Attribute>
<Attribute name="iplanet-am-naming-samlpostservlet-url" value="http://identityserver.sun.com:58081/amserver/SAMLPOSTProf ileServlet"></Attribute>
<Attribute name="iplanet-am-naming-auth-class" value="com.sun.identity.authentication.server.AuthXMLHandler"></ Attribute>
</GetNamingProfile>
</NamingResponse>]]></Response>
</ResponseSet>
ネーミングサービスにより提供される情報を使用して、ポリシーエージェントはセッションサービスへの POST 要求を作成して、含まれるセッショントークンを検証します。コード例 5-12 に、セッションサービスへの POST 要求を示します。
コード例 5-12 セッションサービスへのセッション検証用の POST 要求
POST /amserver/sessionservice HTTP/1.0
Host: identityserver.sun.com
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RequestSet vers="1.0" svcid="Session" reqid="10">
<Request><![CDATA[
<SessionRequest vers="1.0" reqid="4">
<GetSession reset="true">
<SessionID>AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=</Ses sionID>
</GetSession>
</SessionRequest>]]>
</Request>
<Request><![CDATA[
<SessionRequest vers="1.0" reqid="5">
<AddSessionListener>
<URL>http://application.sun.com:8089/amagent/UpdateAgentCacheSer vlet?shortcircuit=false</URL>
<SessionID>AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=</Ses sionID>
</AddSessionListener>
</SessionRequest>]]>
</Request>
</RequestSet>
セッションサービスは、要求を受信し、セッショントークンの有効性をチェックします。セッションがタイムアウトしていることも、その他の理由で無効であることもないと仮定し、セッションサービスはセッションが有効であると応答します。このアサーションは、セッション自体のサポート情報と一体化しています。
コード例 5-13 に、セッションサービスの応答を示します。
コード例 5-13 セッションの有効性を示すセッションサービス応答
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseSet vers="1.0" svcid="session" reqid="10">
<Response><![CDATA[<SessionResponse vers="1.0" reqid="4">
<GetSession>
<Session sid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" stype="user" cid="uid=user1,ou=people,dc=sun,dc=org" cdomain="dc=sun,dc=org" maxtime="300" maxidle="120" maxcaching="3" timeidle="0" timeleft="17993" state="valid">
<Property name="authInstant" value="2003-10-02T01:38:23Z"></Property>
<Property name="clientType" value="genericHTML"></Property>
<Property name="CharSet" value="UTF-8"></Property>
<Property name="Locale" value="en_US"></Property>
<Property name="UserToken" value="user1"></Property>
<Property name="loginURL" value="http://identityserver.sun.com:58081/amserver/UI/Login"></ Property>
<Property name="SessionHandle" value="shandle:AQIC5wM2LY4SfcxlvOiI7LJwWcusZAdkM3CHmIoeehu6urc=" ></Property>
<Property name="Host" value="192.168.1.100"></Property>
<Property name="AuthType" value="LDAP"></Property>
<Property name="Principals" value="uid=user1,ou=People,dc=sun,dc=org|AQIC5wM2LY4SfcywFlTefDR mqlthG54qrg27LiyS8LnHAj4="></Property>
<Property name="cookieSupport" value="true"></Property>
<Property name="Organization" value="dc=sun,dc=org"></Property>
<Property name="USERS_DN" value="uid=user1,ou=people,dc=sun,dc=org"></Property>
<Property name="AuthLevel" value="0"></Property>
<Property name="UserId" value="user1"></Property>
<Property name="HostName" value="192.168.1.100"></Property>
<Property name="Principal" value="uid=user1,ou=people,dc=sun,dc=org"></Property>
</Session></GetSession>
</SessionResponse>]]></Response>
<Response><![CDATA[<SessionResponse vers="1.0" reqid="5">
<AddSessionListener>
<OK></OK>
</AddSessionListener>
</SessionResponse>]]></Response>
</ResponseSet>
ポリシーユーザーの提供したセッショントークンが有効であることを示す応答を受け取ると、ポリシーエージェントは要求されたリソースへのアクセスをユーザーに許可できるかどうかを判定する必要があります。ポリシーエージェントは、HTTP ネームスペース内の一部のリソースに関する決定を求める、ポリシーサービスへの要求を作成します。この要求と共に、IP アドレスや DNS 名など、設定済みポリシーの条件セットに影響を与える可能性のある追加環境情報も含まれます。コード例 5-14 に、情報を求めてポリシーサービス URI に送信される POST 要求を示します。
コード例 5-14 ポリシー情報を求める POST 要求
POST /amserver/policyservice HTTP/1.0
Host: identityserver.sun.com
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RequestSet vers="1.0" svcid="Policy" reqid="11">
<Request><![CDATA[
<PolicyService version="1.0">
<PolicyRequest requestId="3" appSSOToken="AQIC5wM2LY4SfczlhkwdQHfKgzxYu0qWY+DFCB9VGmknzvM=">
<GetResourceResults userSSOToken="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" serviceName="iPlanetAMWebAgentService" resourceName="http://application.sun.com:8089/" resourceScope="subtree">
<EnvParameters>
<AttributeValuePair>
<Attribute name="requestDnsName"/>
<Value>drnick</Value>
<Value>drnick.sun.com</Value>
</AttributeValuePair>
<AttributeValuePair>
<Attribute name="requestIp"/>
<Value>192.168.1.100</Value>
</AttributeValuePair>
</EnvParameters>
</GetResourceResults>
</PolicyRequest>
</PolicyService>]]>
</Request>
</RequestSet>
ポリシーサービスは、要求を受信した後で、要求に適用されるリソース定義を含むポリシーをチェックします。
要求に適用されるポリシーが検出されると、ポリシーサービスは、セッショントークンにより識別されたユーザーがいずれかのポリシーサブジェクトのメンバーであるかどうかを確認します。リソースに適合するポリシーが検出され、かつユーザーが有効なサブジェクトである場合、ポリシーの追加条件 (日時は正確かどうか、適切なネットワークから送信されたものかどうかなど) が評価されます。すべての条件が満たされる場合、ポリシーサービスは、ユーザーにアクセスを許可できると判断し、ポリシーエージェントに許可の決定を伝えます。コード例 5-15 に、ユーザーが保護されたリソースにアクセス可能であることを確認する、ポリシーサービスからの応答を示します。
コード例 5-15 許可ポリシー応答
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseSet vers="1.0" svcid="policy" reqid="11">
<Response><![CDATA[<PolicyService version="1.0">
<PolicyResponse requestId="3">
<ResourceResult name="http://application.sun.com:8089/">
<PolicyDecision>
<ActionDecision timeToLive="1065121515571">
<AttributeValuePair>
<Attribute name="POST"/>
<Value>allow</Value>
</AttributeValuePair>
<Advices>
</Advices>
</ActionDecision>
<ActionDecision timeToLive="1065121515571">
<AttributeValuePair>
<Attribute name="GET"/>
<Value>allow</Value>
</AttributeValuePair>
<Advices>
</Advices>
</ActionDecision>
</PolicyDecision>
</ResourceResult>
</PolicyResponse>
</PolicyService>]]>
</Response>
要求されたページポリシーエージェントは、ポリシーサービスからの決定を受信したら、このアクセス情報に基づいて動作する必要があります。この場合、GET および POST 操作に対して許可決定が発行されます。これはユーザーが要求した操作と一致するため、ポリシーエージェントはアクセスを許可します。決定はセッショントークンと共にキャッシュされるため、後続の要求はキャッシュを使用してチェックできます。Identity Server との通信は必要ありません。管理者により定義された時間を過ぎるか、ポリシーまたはセッションの状態変更が明示的に通知されると、キャッシュは期限切れになります。ただし、ユーザーにアクセスが許可される前にアクションをログに記録して、監査トレールを維持する必要があります。ポリシーエージェントは、ログ要求をログサービスに発行します。コード例 5-16 にログ要求を示します。
コード例 5-16 ポリシーエージェントからのログ要求
POST /amserver/loggingservice HTTP/1.0
Host: identityserver.sun.com
Content-Length: 416
Accept: text/xml
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RequestSet vers="1.0" svcid="Logging" reqid="12">
<Request><![CDATA[
<logRecWrite reqid="2"><log logName="amAuthLog" sid="AQIC5wM2LY4SfczlhkwdQHfKgzxYu0qWY+DFCB9VGmknzvM="></log><lo gRecord><recType>Agent</recType><recMsg>User user1 was allowed access to http://application.sun.com:8089/index.html.</recMsg></logRecord> </logRecWrite>]]></Request>
</RequestSet>
ログサービスは要求を受信し、設定に基づいて、要求を署名済みのファイル (オプション) または JDBC ストアに記録します。その後、応答はポリシーエージェントに返されて、ログが通知されます。コード例 5-17 に応答を示します。
コード例 5-17 エージェントにログを通知する応答
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseSet vers="1.0" svcid="iplanet.webtop.service.logging" reqid="12">
<Response><![CDATA[OK]]></Response>
</ResponseSet>
これで、要求されたリソースへのアクセスがポリシーエージェントにより許可されました。コード例 5-18 に、要求されたリソースの HTML ページを示します。(HTML 自体は、簡略化のために削除されています。)
コード例 5-18 エージェントによる要求されたページへのアクセス許可
HTTP/1.1 200 Ok
Content-type: text/html
<HTML>
The requested page....
</HTML>
シングルサインオン要求この節では、2 つのスレッドについて説明します。最初のスレッドは、認証されたユーザーが、同じ DNS ドメイン内の異なるサーバー上の、セッショントークンにより検証済みの保護されたリソースを要求した時点で発生します。この 1 番目のスレッドはシングルサインオン機能を使用します。2 番目のスレッドは、認証されたユーザーが、異なる DNS ドメイン内の異なるサーバー上の保護されたリソースを要求した時点で発生します。2 番目のスレッドは、クロスドメインのシングルサインオン機能を使用します。
スレッド 1: シングルサインオン
要求したページの受信後に、ユーザーは異なるサーバー上の保護されたリソースを要求します。コード例 5-19 は、この 2 番目の要求を示します。セッショントークンが要求に含まれている点に注目してください。これにより、シングルサインオンが可能になります。
コード例 5-19 有効なセッショントークンを含む 2 番目の要求
GET / HTTP/1.1
Host: webservice.sun.com:8090
Cookie: iPlanetDirectoryPro=AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnH Aj4%3D
セッショントークンが存在するため、ポリシーエージェントはユーザー認証を取得する必要はありません。このため、この場合は、「認証」で説明した手順は省略されます。ただし、エージェントは、以前のセッショントークンを (キャッシュされたエントリが存在しないため) 表示できません。このため、「セッショントークン」、「ポリシー」および「要求されたページ」に記載された手順を実行します。
注
以下に示す手順は、「セッショントークン」、「ポリシー」および「要求されたページ」に記載されている手順を大幅に修正したものです。
- ネーミングサービスとの通信が行われます。コード例 5-20 に、Identity Server が使用する内部サービスの URL を求めるネーミングサービスへの要求を示します。ネーミングサービスは、セッションを暗号化し、対応する URL を返します。この URL を使用して、セッションデータの取得が行われます。
コード例 5-20 ネーミングサービスの POST 要求
POST /amserver/namingservice HTTP/1.0
Host: identityserver.sun.com
...
<NamingRequest vers="1.0" reqid="2" sessid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=">
....
HTTP/1.1 200 OK
<ResponseSet vers="1.0" svcid="com.iplanet.am.naming" reqid="9">
....
</ResponseSet>
- ネーミングサービスからの応答に基づき、適切なセッションサービスとの通信が行われます。コード例 5-21 に、セッション ID を含むセッションサービスに送信される要求を示します。
コード例 5-21 セッションサービスへの POST 要求
POST /amserver/sessionservice HTTP/1.0
...
<SessionID>AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=</Ses sionID>
....
HTTP/1.1 200 OK
....
<Session sid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" stype="user" cid="uid=user1,ou=people,dc=sun,dc=org" cdomain="dc=sun,dc=org" maxtime="300" maxidle="120" maxcaching="3" timeidle="0" timeleft="17991" state="valid">
....
- セッションサービスからの有効なセッション応答を想定し、ポリシーサービスに POST 要求が行われます。コード例 5-22 に、認証済みのユーザーに関するポリシー情報を求める、ポリシーサービスへの要求を示します。
コード例 5-22 ポリシーサービスへの POST 要求
POST /amserver/policyservice HTTP/1.0
...
<GetResourceResults userSSOToken="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" serviceName="iPlanetAMWebAgentService" resourceName="http://webservice.sun.com:8090/" resourceScope="subtree">
...
- この場合、保護されたリソースへのアクセスを許可するポリシーは検出されず、ポリシーサービスは適切な否定応答を返します。コード例 5-23 に、この応答を示します。
コード例 5-23 ポリシーサービスからのアクセス否定応答
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseSet vers="1.0" svcid="policy" reqid="11">
<Response><![CDATA[<PolicyService version="1.0">
<PolicyResponse requestId="3">
<ResourceResult name="http://webservice.sun.com:8090/">
<PolicyDecision>
</PolicyDecision>
</ResourceResult>
</PolicyResponse>
</PolicyService>]]>
</Response>
</ResponseSet>
- ポリシーエージェントでログが設定されているため、このアクセス拒否がポリシーエージェントによりログに記録されます。コード例 5-24 に、要求したリソースへのアクセスがユーザーに許可されなかったことを示すログの記録を求める、ログサービスへの要求を示します。
コード例 5-24 ログサービスへの POST 要求
POST /amserver/loggingservice HTTP/1.0
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RequestSet vers="1.0" svcid="Logging" reqid="12">
<Request><![CDATA[
<logRecWrite reqid="2"><log logName="amAuthLog" sid="AQIC5wM2LY4SfcyueSeNMEFDFRRLub8BfjaxeyDvTPXlVnA="></log><lo gRecord><recType>Agent</recType><recMsg>User user1 was denied access to http://webservice.sun.com:8090/index.html.</recMsg></logRecord>< /logRecWrite>]]></Request>
</RequestSet>
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseSet vers="1.0" svcid="iplanet.webtop.service.logging" reqid="12">
<Response><![CDATA[OK]]></Response>
</ResponseSet>
- 次に、ポリシーエージェントは Forbidden メッセージをユーザーに発行します。コード例 5-25 に、このメッセージを表示する HTML ページを示します。ここで、アクセスが拒否されたことを示す、管理者の指定したページにユーザーをリダイレクトすることもできます。
スレッド 2: クロスドメインシングルサインオン
2 番目の要求ページへのアクセスが拒否されたため、ユーザーは別の DNS ドメイン内のサーバーに存在する保護されたリソースを要求します。Identity Server は、HTTP ドメイン Cookie (http://www.ietf.org/rfc/rfc2965.txt) を使用してアプリケーション間でトークンを転送するため、「スレッド 1: シングルサインオン」のように、要求を使ってポリシーエージェントにトークンが自動的に渡されることはありません。
- トークンを新規 DNS ドメインに転送して、ドメイン内のアプリケーションから使用可能にするのは、Identity Server 内の CDSSO (Cross Domain Single Sign-On) プロトコルの役割です。コード例 5-26 に、別の DNS ドメイン内の保護されたアプリケーションへのアクセスをセッショントークンなしで求める要求を示します。
コード例 5-26 別の DNS ドメイン内の保護されたアプリケーションの GET 要求
GET /index.html?sunwMethod=GET HTTP/1.1
Host: webservice.java.com:8088
- ポリシーエージェントは、セッショントークンが存在しないことを認識します。ただし、この場合、エージェントは CDSSO 用に設定されているため、リダイレクトは認証サービスではなく、セッションの転送に Liberty プロトコルを使用する CDSSO コントローラサービスに対して行われます。このため、リダイレクトには関連する Liberty パラメータが含まれます。コード例 5-27 に、ブラウザ経由で行われる、Liberty パラメータを含むリダイレクトを示します。
コード例 5-27 ブラウザ経由で行われる CDSSO コントローラサービスへのリダイレクト
HTTP/1.1 302 Moved Temporarily
Location: http://identityserver.sun.com:58081/amserver/cdcservlet?goto=htt p%3A%2F%2Fwebservice.java.com%3A8088%2Findex.html%3FsunwMethod%3 DGET&refererservlet=http%3A%2F%2Fwebservice.java.com%3A8088%2Fin dex.html%3FsunwMethod%3DGET&RequestID=29980&MajorVersion=1&Minor Version=0&ProviderID=http%3A%2F%2Fwebservice.java.com%3A8088%2Fa magent&IssueInstant=2003-10-02T04%3A25%3A06Z&ForceAuthn=false&Is Passive=false&Federate=false
- HTTP で待機中のユーザーのブラウザにより、リダイレクトが許可されます。今回、プライマリドメイン内の Cookie であるため、要求にはセッショントークンが含まれます。コード例 5-28 に、ブラウザから CDSSO コントローラサービスへの、セッショントークンを含む HTTP リダイレクトを示します。
コード例 5-28 セッショントークンを含む、ブラウザからの HTTP リダイレクト
GET /amserver/cdcservlet?goto=http%3A%2F%2Fwebservice.java.com%3A808 8%2Findex.html%3FsunwMethod%3DGET&refererservlet=http%3A%2F%2Fwe bservice.java.com%3A8088%2Findex.html%3FsunwMethod%3DGET&Request ID=29980&MajorVersion=1&MinorVersion=0&ProviderID=http%3A%2F%2Fw ebservice.java.com%3A8088%2Famagent&IssueInstant=2003-10-02T04%3 A25%3A06Z&ForceAuthn=false&IsPassive=false&Federate=false HTTP/1.1
Host: identityserver.sun.com:58081
Cookie: iPlanetDirectoryPro=AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnH Aj4%3D
- CDSSO コントローラサービス内の CDC サーブレットはセッショントークンを受け取り、セッション情報の詳細を定めた Liberty Post プロファイル応答を作成して、ブラウザに返信します。コード例 5-29 に、この返信を示します。
コード例 5-29 ブラウザへの POST 返信
HTTP/1.1 200 OK
Server: Sun-ONE-Web-Server/6.1
Date: Thu, 02 Oct 2003 01:38:28 GMT
Content-type: text/html
Pragma: no-cache
Transfer-encoding: chunked
<HTML>
<BODY Onload="document.Response.submit()">
<FORM NAME="Response" METHOD="POST" ACTION="http://webservice.java.com:8088/index.html?sunwMethod=GE T">
<INPUT TYPE="HIDDEN" NAME="LARES" VALUE="<ENCODED_LIBERTY_DOC>"/>
</FORM>
</BODY></HTML>
- ユーザーのブラウザは、Body タグ onLoad に含まれる Action および Javascript に基づいて、Liberty ドキュメントを含むフォームをポリシーエージェントに自動的に送信します。コード例 5-30 に、ポリシーエージェントへのブラウザ POST を示します。
コード例 5-30 ポリシーエージェントへのブラウザ POST
POST /index.html?sunwMethod=GET HTTP/1.1
Host: webservice.java.com:8088
Referer: http://identityserver.sun.com:58081/amserver/cdcservlet?goto=htt p%3A%2F%2Fwebservice.java.com%3A8088%2Findex.html%3FsunwMethod%3 DGET&refererservlet=http%3A%2F%2Fwebservice.java.com%3A8088%2Fin dex.html%3FsunwMethod%3DGET&RequestID=29980&MajorVersion=1&Minor Version=0&ProviderID=http%3A%2F%2Fwebservice.java.com%3A8088%2Fa magent&IssueInstant=2003-10-02T04%3A25%3A06Z&ForceAuthn=false&Is Passive=false&Federate=false
Content-Type: application/x-www-form-urlencoded
LARES=<ENCODED_LIBERTY_DOC>
- ポリシーエージェントは、Liberty ドキュメントを受信して、ユーザーのセッション情報を抽出します。この時点で、ポリシーエージェントが通常のエージェントと同様の方法でセッションを検証する必要があります。このため、リソースへのアクセスを許可または拒否する前に、「セッショントークン」、「ポリシー」、および「要求されたページ」に記載された手順に従って処理が実行されます。
注
説明を簡略化するため、「セッショントークン」、「ポリシー」および「要求されたページ」の内容はここでは繰り返しません。
この場合、セッショントークンは有効であると判定され、ユーザーはアクセスが許可されます。ポリシーエージェントは、要求されたドキュメントをユーザーに渡し、新規 DNS ドメインの Cookie 内にセッショントークンを設定します。これで、新規ドメイン内のすべてのエージェントが Cookie を使用できるようになります。コード例 5-31 に、新規 DNS ドメイン Cookie セットを含む、返される HTML ページを示します。(HTML 自体は、簡略化のために削除されています。)
セッションの終了
- 認証、および SSO と CDSSO の実行が完了したため、ユーザーはセッションを終了できます。セッションは、アイドルや最大タイムアウト、またはユーザーの明示的なログアウトを条件に、管理者が終了できます。この場合は、ユーザーがサービスへのリンクをクリックしてログアウトします。コード例 5-32 に、ログアウトサービスへのアクセス要求を示します。
コード例 5-32 ログアウトサービスの GET 要求
GET /amserver/UI/Logout HTTP/1.1
Host: identityserver.sun.com:58081
Cookie: iPlanetDirectoryPro=AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnH Aj4%3D
- ログアウトサービスは、ログアウト要求を受信し、ユーザーのセッションを破棄されたものとしてマークし、セッショントークンに無効な値を新たに設定し、成功を示すログアウトページをユーザーに返します。コード例 5-33 に、ログアウト成功後にユーザーに送信される HTML ページの詳細を示します。(HTML 自体は、簡略化のために削除されています。)
コード例 5-33 ユーザーに返される成功を示す HTML ページ
HTTP/1.1 200 OK
Server: Sun-ONE-Web-Server/6.1
Set-cookie: iPlanetDirectoryPro=AQICv6c3Z1VfvgCgpLlaEqkqM70TLV24OTB1XkPa%2BL tA8bXvC7c5XABU95Ta8UJi6dQZhXEUSgTRBWHXQ6kcxe8qgw%3D%3D;Domain=.s un.com;Path=/
<title>Sun ONE Identity Server (Logout)</title>
...
- ユーザーのセッション状態が変更されたため、セッションに関心を示したアプリケーションに通知するのはセッションサービスの役割になります。この場合は、各ポリシーエージェントはセッション通知用に設定されており、セッションが無効であることをエージェントに通知するドキュメントがポリシーエージェントごとに送信されます。これにより、セッションがキャッシュからフラッシュされます。
コード例 5-34 セッション通知用の POST
POST /amagent/UpdateAgentCacheServlet?shortcircuit=false HTTP/1.1
Host: application.sun.com:8089
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NotificationSet vers="1.0" svcid="session" notid="8">
<Notification><![CDATA[<SessionNotification vers="1.0" notid="8">
<Session sid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" stype="user" cid="uid=user1,ou=people,dc=sun,dc=org" cdomain="dc=sun,dc=org" maxtime="300" maxidle="120" maxcaching="3" timeidle="3" timeleft="17983" state="destroyed">
<Property name="authInstant" value="2003-10-02T01:38:23Z"></Property>
<Property name="clientType" value="genericHTML"></Property>
<Property name="CharSet" value="UTF-8"></Property>
<Property name="Locale" value="en_US"></Property>
<Property name="UserToken" value="user1"></Property>
<Property name="loginURL" value="http://identityserver.sun.com:58081/amserver/UI/Login"></ Property>
<Property name="SessionHandle" value="shandle:AQIC5wM2LY4SfcxlvOiI7LJwWcusZAdkM3CHmIoeehu6urc=" ></Property>
<Property name="Host" value="192.168.1.100"></Property>
<Property name="AuthType" value="LDAP"></Property>
<Property name="Principals" value="uid=user1,ou=People,dc=sun,dc=org|AQIC5wM2LY4SfcywFlTefDR mqlthG54qrg27LiyS8LnHAj4="></Property>
<Property name="cookieSupport" value="true"></Property>
<Property name="Organization" value="dc=sun,dc=org"></Property>
<Property name="USERS_DN" value="uid=user1,ou=people,dc=sun,dc=org"></Property>
<Property name="AuthLevel" value="0"></Property>
<Property name="UserId" value="user1"></Property>
<Property name="HostName" value="192.168.1.100"></Property>
<Property name="Principal" value="uid=user1,ou=people,dc=sun,dc=org"></Property>
</Session>
<Type>5</Type>
<Time>1065058714469</Time>
</SessionNotification>]]></Notification>
</NotificationSet>
POST /amagent/UpdateAgentCacheServlet?shortcircuit=false HTTP/1.1
Host: webservice.sun.com:8090
....
<Session sid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" stype="user" cid="uid=user1,ou=people,dc=sun,dc=org" cdomain="dc=sun,dc=org" maxtime="300" maxidle="120" maxcaching="3" timeidle="3" timeleft="17983" state="destroyed">
...
POST /amagent/UpdateAgentCacheServlet?shortcircuit=false HTTP/1.1
Host: webservice.java.com:8088
...
<Session sid="AQIC5wM2LY4SfcywFlTefDRmqlthG54qrg27LiyS8LnHAj4=" stype="user" cid="uid=user1,ou=people,dc=sun,dc=org" cdomain="dc=sun,dc=org" maxtime="300" maxidle="120" maxcaching="3" timeidle="3" timeleft="17983" state="destroyed">
...
- セッション通知の受信後に、ポリシーエージェントはキャッシュからセッションをフラッシュします。これで、セッションのライフサイクルは終了します。