ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebCenter WSRP Producer for .NET開発ガイド
11gリリース1 (11.1.1.7.0)
B69391-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
 

5 一般的な開発シナリオの実装

この章では、一般的な開発シナリオ用の手順を追ったチュートリアルを示します。

この章の内容は次のとおりです。

5.1 ポートレットとしてのWebパーツの追加

デフォルトでは、ASP.NET Webパーツ・エディタ・ゾーンは、3つの異なるタイプのプリファレンス(パーソナライズと呼びます)をサポートしています。この項では、デフォルト・プリファレンスの操作方法について説明します。Oracle WebCenter WSRP Producer for .NETは、カスタム・パーソナライズ・エディタもサポートしています。

次の例では、手順1から3で、WSRPプロデューサの外部でASP.NETで使用するためにASP.NET Webパーツを作成し、手順5から8で、WebパーツをOracle WebCenter WSRP Producer for .NETに追加します。ユーザー・コントロールからWebパーツを作成する方法の詳細は、Microsoft社のドキュメント(http://msdn.microsoft.com/en-us/magazine/cc300767.aspx)を参照してください。

  1. Visual Studio Webアプリケーション・プロジェクトを開き、TestPreferences.ascxというWebユーザー・コントロールを作成します。


    ヒント:

    Visual Studioプロジェクトは、Webサイト・プロジェクトではなく、Webアプリケーション・プロジェクトであり、プロジェクト・タイプがVisual C#である必要があります。

  2. lblStringPreflblBooleanPrefおよびlblEnumPrefという3つのラベルを追加します。

  3. [Personalizable, WebBrowsable]属性を含む3つのプロパティを作成します。ラベルの表示値を、次のコード例に示すプロパティに合わせます。

    protected void Page_Load(object sender, EventArgs e)
       {
           lblBooleanPref.Text = "Checkbox Pref: " + _boolPref;
           lblStringPref.Text = "Text Pref: " + _stringPref;
           lblEnumPref.Text = "Dropdown Pref: " + _enumPref;
    
       }
       #region Preferences
       private string _stringPref = "";
       private bool _boolPref = false;
    
       public enum TestEnum
       {
           ListItem1, ListItem2, ListItem3
       }
       private TestEnum _enumPref = TestEnum.ListItem2;
    
       [Personalizable, WebBrowsable]
       public string TextPref
       {
           get { return _stringPref; }
           set { _stringPref = value; }
       }
    
       [Personalizable, WebBrowsable]
       public bool CheckboxPref
       {
           get { return _boolPref; }
           set { _boolPref = value; }
       }
    
       [Personalizable, WebBrowsable]
       public TestEnum DropdownPrefs
       {
           get { return _enumPref; }
           set { _enumPref = value; }
       }
       #endregion
    
  4. 続行する前に、コードがコンパイルされることをテストします。

  5. installdir\wsrpdefault\portletsの下にある既存の\ASPNET_AJAX_sampleフォルダのコピーを作成し、名前をTestPreferencesに変更します。

  6. Simple_DateTime.ascxファイルを、手順1から3で作成したTestPreferences.ascxファイルに置き換えます。

  7. コンパイルされたアセンブリを、Visual Studioプロジェクトからinstalldir\wsrpdefault\binフォルダにコピーします。

  8. installdir\wsrpdefault\portlets\TestPreferencesにあるdefault.aspxファイルを更新して、Simple_Date_Timeコントロールのかわりに自分のコントロールを参照させます。結果として得られるコードは、次のようになります。

    <%@ Page Language="C#" MasterPageFile="~/portlets/Resources/MasterPages/WSRP.Master" Title="Content Page Test" %>
    <%@ Register src= "~/portlets/TestPreferences/UserControl/TestPreferences.ascx" tagname="TestPreferences" tagprefix="uc1" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="webpartcontrol" Runat="Server">
        <uc1:TestPreferences ID="TestPreferences1" runat="server" />
    </asp:Content>
    
  9. 次のようにしてinstalldir\wsrpdefault\wsrp-producer.xmlファイルを更新して、ポートレットを含めます。

    • 既存の<portlet>要素およびその内容のコピーを作成します。

    • ハンドル、表示名、説明、タイトルおよび短いタイトルの各要素を、新しいポートレットの適切な値に変更します。

    • <portlet-mode>要素の下の<url>ノードを更新して、ポートレットを指すようにします。

    前述の例の場合、<portlet>要素は、次のようになります。

    <portlet>
     <handle>TestPreferences</handle>
     <supported-locale>en,fr</supported-locale>   
     <descriptions>
      <description lang="en">Test Preferences</description>
      <description lang="fr">Test Preferences</description>
     </descriptions>
     <display-names>
      <display-name lang="en">Test Preferences</display-name>
      <display-name lang="fr">Test Preferences</display-name>
     </display-names>
     <titles>
      <title lang="en">Test Preferences</title>
      <title lang="fr">Test Preferences</title>
     </titles>
     <short-titles>
      <short-title lang="en">Test Preferences</short-title>
      <short-title lang="fr">Test Preferences</short-title>
     </short-titles>
     <supports>
      <portlet-modes>
       <portlet-mode>
        <name>wsrp:view</name>
        <url>/portlets/TestPreferences/default.aspx</url>
       </portlet-mode>
       <portlet-mode>
        <name>wsrp:edit</name>
        <url>/portlets/TestPreferences/default.aspx</url>
       </portlet-mode>
      </portlet-modes>
      <mime-type>text/html</mime-type>
     </supports>
     <user-profile>
      <profile-item>businessInfo/online/email</profile-item>
     </user-profile>
    </portlet>
    
  10. 「スタート」→「プログラム」→「Oracle WebCenter WSRP Producer for .NET」→「WSRP 2.0 WSDL」のショートカットにあるWSDL URLでWSRPコンシューマを指すことによって、Oracle WebCenter WSRP Producer for .NETを登録します。(WSRPプロデューサWSDLの登録方法の詳細は、WSRPコンシューマ・ポータルの製品ドキュメントを参照してください)。

  11. これで、ポートレットがWSRPコンシューマで使用可能になります。ポートレットをテストします。

    1. ポートレットをポータルに追加します。TestPreferences.ascxファイルのプリファレンスに設定されているデフォルト値を示す3つのラベルが表示されます。

    2. WSRPコンシューマ・ポータルのドキュメントに従って、プリファレンス・エディタにアクセスします。独自のWebパーツ・エディタ・ゾーンを.NETに追加する場合に表示されるものと同じプリファレンス・エディタが表示されます。プリファレンスを変更して 「閉じる」をクリックし、ラベルが変更されていることを確認します。

    3. ポータルからログアウトして、再びポータルにログインします。変更したプリファレンス値が維持されます。

5.2 ASP.NET AJAXコントロールを備えたWebパーツの追加

Oracle WebCenter WSRP Producer for .NETの主要な機能は、ASP.NET AJAXを使用して表示されるコントロールのサポートです。

このチュートリアルでは、前の項の例から始めます。手順の大半は、ASP.NET AJAX機能を使用するようにASP.NET Webパーツを設定するために必要な標準的なタスクです。ASP.NET AJAXスクリプト・マネージャおよび更新パネルの設定方法の詳細は、Microsoft社のドキュメントを参照してください。

  1. 第5.1項「ポートレットとしてのWebパーツの追加」で作成したプロジェクトを開きます。

  2. Visual Studioツールボックスの「AJAX Extensions」から、Script ManagerおよびUpdate Panelを追加します。

  3. UpdatePanelの内側にラベル、テキスト・ボックスおよびボタンを追加します。

  4. UpdatePanelの外側にラベル、テキスト・ボックスおよびボタンを追加します。完了したら、ソース・ビューは次のようになります。

    <%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="TestPreferences.ascx.cs" Inherits="TestPref.TestPreferences" %> 
    <%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, 
    Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
        Namespace="System.Web.UI" TagPrefix="asp" %> 
    <asp:Label ID="lblStringPref" runat="server" Text="Label"></asp:Label><br />
    <asp:Label ID="lblBooleanPref" runat="server" Text="Label"></asp:Label><br />
    <asp:Label ID="lblEnumPref" runat="server" Text="Label"></asp:Label><br />
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:TextBox ID="txtAjax" runat="server"></asp:TextBox>
        <asp:Button ID="btnAjax" runat="server" Text="PostAJAX" /><br />
        <asp:Label ID="lblAjax" runat="server" Text="AJAX post here"></asp:Label>
    </ContentTemplate>
    </asp:UpdatePanel>
    <asp:TextBox ID="txtPostback" runat="server"></asp:TextBox>
    <asp:Button ID="btnPostback" runat="server" Text="Postback" /><br />
    <asp:Label ID="lblPostback" runat="server" Text="Postback content here"></asp:Label>
    
  5. テキスト・ボックス・エントリがラベルに表示されるように、ページ・ロード・メソッドを変更します。ページ・ロード・メソッドのソース・コードは、次のようになります

    protected void Page_Load(object sender, EventArgs e)
            {
                lblBooleanPref.Text = "Checkbox Pref: " + _boolPref;
                lblStringPref.Text = "Text Pref: " + _stringPref;
                lblEnumPref.Text = "Dropdown Pref: " + _enumPref;
     
                lblAjax.Text = txtAjax.Text;
                lblPostback.Text = txtPostback.Text; 
           }
    
  6. 続行する前に、コードがコンパイルされることをテストします。(コントロールが動作することをテストするために、Visual StudioプロジェクトのASPXページにコントロールを登録することもできます。詳細は、Visual Studioのドキュメントを参照してください)。

  7. テキスト・エディタでTestPreferences.ascxファイルを開き、asp:ScriptManagerコントロールを削除します。Oracle WebCenter WSRP Producer for .NETは、ScriptManagerを登録するASP.NETマスター・ページを参照し、ASP.NETでは、1つのアプリケーションに対して複数のScriptManagerは許可されません。詳細は、マスター・ページおよびScriptManagerに関するMicrosoft社のドキュメントを参照してください。

  8. 続行する前に、コードがコンパイルされることをテストします。

  9. installdir\wsrpdefault\portlets\TestPreferences.ascxファイルを最新バージョンのファイルに置き換えます。

  10. installdir\wsrpdefault\binフォルダ内のコンパイル済アセンブリを置き換えます。

  11. ポータルに戻ってポートレットをリフレッシュし、ポートレットの機能を再びテストします。

5.2.1 .NET Frameworkの外側のAJAXの管理

ASP.NET 3.5 AJAXコントロールを使用するのではなく、XMLHttpRequestsを直接制御する必要がある場合があります。これを行うには、URLはWSRPプロキシを介して変換されるということに注意する必要があります。このチュートリアルでは、単純なAJAXプロジェクトを動作させるために必要な手順について説明します。

  1. この例は、前の例のコードから始めます。前述の例のasp:Labelの下に、次のコードを追加します。

    <!-- Added for simple AJAX sample -->
    <br />
    <asp:ListBox ID="listBoxPets" runat="server">
        <asp:ListItem Text="cat" Value="cat" Selected="True"/>
        <asp:ListItem Text="dog" Value="dog" />
        <asp:ListItem Text="bird" Value="bird" />
        <asp:ListItem Text="fish" Value="fish" />
    </asp:ListBox>
    <!-- This href URL will be properly transformed by WSRP proxy -->
    <a id="hiddenposturl" href="AjaxPostDestination.aspx" visible="false" ></a>
    <br />
    <!-- Result of selection will be placed here -->
    <div id="AjaxResponse"></div> 
    

    このコードは、XMLHttpRequestによるデータの送信先となるURLを指すhrefが表示されていない単純なリストボックスを構築します。マークアップ・トランスフォーマがWSRPプロキシのURLを書き換えられるように、このURLはアンカーhref内に配置します。(変換の詳細は、第5.5項「マークアップ変換の使用方法」を参照してください)。


    注意:

    この例では、レスポンス内で返されるURLはありません。ただし、ポートレット・コンテンツ変換ルールセットによって変換されるAJAXリクエストからのレスポンスが必要になることがあります(WSRPコンシューマによってプロキシ処理するURLがある場合など)。これを行うには、handle問合せ文字列引数を、wsrp-producer.xml内のポートレットに付与したハンドルを参照するターゲットURLに追加します。この例では、非表示のURLが変更されるように、ハンドルはTestPreferencesになります。
    <a id="hiddenposturl" href="AjaxPostDestination.aspx?handle=TestPreferences" visible="false" ></a>
    

    返されるコンテンツ・タイプがtext/html (この例ではtext/plain)になるようにする必要もあります。そうしないと、特定のWSRPコンシューマは変換済URLを適切にプロキシ処理しません。ルールセットの詳細は、第2.2項「ポートレット・コンテンツ変換ルールセット」を参照してください。


  2. <div>の下に、次のJavaScriptを追加します。

    <script language="javascript" type="text/javascript">
        var xmlHttp;
        /*  Tap into the onchange event so that whenever an item is selected in the
        list box, that value is sent to the server.
        */
        var selectmenu;
        var selectMenus = getElementsByTagNameAndEndingId("select", "listBoxPets");
        selectmenu = selectMenus[0];
        selectmenu.onchange = function() {
            // Prepare the XHR
            createXMLHttpRequest();
            // Get the selected value
            var selectedPet = getSelectedPet();
            // get the URL from a hidden argument since this will be transformed.
            var hiddenPetURL = getElementsByTagNameAndEndingId("a", "hiddenposturl");
            // Prepare the request.
            xmlHttp.open("POST", hiddenPetURL, true);
            // Assign this to a function that will process the requested items
            xmlHttp.onreadystatechange = handleStateChange;
            // Important note - If you use application/x-www-form-urlencoded you must include the ;charset=UTF-8 or
            // will not work in Firefox 3.x.  Works fine in all versions of IE.
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            // Send the value as post parameters.  This is the suggested methodology
            //  using the Oracle WebCenter WSRP Producer for .NET
            xmlHttp.send("petselection=" + selectedPet);
        }
     
        /*
        Standard AJAX method.  This creates the appropriate XMLHttpRequest 
    (XHR) object, the core of AJAX.
        */
        function createXMLHttpRequest() {
            if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            else {
                xmlHttp = new XMLHttpRequest();
            }
        }
     
        /*
        This function handles the results of the XMLHttpRequest (XHR).
        This is part of the standard AJAX methodology of using the onreadystatechange
     event of the XHR to manage the results.
        */
        function handleStateChange() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    parseResults();
                }
            }
        }
     
        /*
        This helper function grabs the first selection and returns it
        */
        function getSelectedPet() {
            var result = "";
            var options = selectmenu.childNodes;
            var option = null;
            for (var i = 0; i < options.length; i++) {
                option = options[i];
                if (option.selected) {
                    result = option.value;
                }
            }
            return result;
        }
     
        /*
        Write out the results returned from the XHR POST
        */
        function parseResults() {
            //var responseDiv = document.getElementById
    ("WebPartManager1_AjaxWebPart2_PetsServerResponse");
            var responseDivs = getElementsByTagNameAndEndingId("div", "AjaxResponse");
            var responseDiv = responseDivs[0];
            if (responseDiv.hasChildNodes()) {
                responseDiv.removeChild(responseDiv.childNodes[0]);
            }
            var responseText = document.createTextNode(xmlHttp.responseText);
            responseDiv.appendChild(responseText);
        }
     
        /*
        This function returns a list of DOM elements that have the tag name specified
     and have an ID that ends in the value supplied.  The reason for this function is
     that ASP.NET prepends control ID's with the webpart zone name and this function
     provides a handy way of locating the our control of interest.
        tagName - DOM tag name to look for (e.g. div, select, p)
        endingID - String that the ID of the DOM elements should end with
        returns - list of DOM elements that have the tag name and have an id that ends
     with value supplied
        */
        function getElementsByTagNameAndEndingId(tagName, endingId) {
            var tagItems = document.getElementsByTagName(tagName);
            var idValue;
            var idNode;
            var startPos;
            var returnElements = new Array(1);  // Typically only one item
            var j = 0;
            for (i = 0; i < tagItems.length; i++) {
                idNode = tagItems.item(i).attributes.getNamedItem("id");
                if (idNode != null) {
                    idValue = idNode.nodeValue;
                    startPos = idValue.indexOf(endingId);
                    if (startPos > -1 && endingId == idValue.substring(startPos)) {
                        returnElements[j] = tagItems.item(i);
                        j++;
                    }
                }
            }
            return returnElements;
        }
     
        </script> 
    

    前述のJavaScriptは、選択したリストボックス項目の値を単に受け取り、これをPOSTパラメータとしてURLに渡し、次にレスポンス・テキストを受け取ってこれをdiv内に配置します。これは最も標準的なAJAXの方法ですが、例外が2つあります。1番目の例外は、URLは表示されていないhrefから取得されるため、WSRPプロキシ処理されたURLに適切に変換されることです。2番目の例外は、URLはWSRPコンシューマによって適切に追加されないため、URLは問合せ文字列パラメータ(ほとんどのAJAXリクエストのように)を含むことができないことです。

  3. 第5.1項「ポートレットとしてのWebパーツの追加」で作成した例と同じディレクトリにAjaxPostDestination.aspxという新しいASPXページを作成することによって、AJAXリクエストの送信先のターゲット・ページを作成します。

  4. 次のコードをファイルに貼り付けます。

    <%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="false" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <!-- NOTE that validaterequest is set to false.  This is the only way our hand-rolled AJAX requests will be accepted. -->
    <head id="Head1" runat="server">
        <title>Untitled Page</title>
        <script language="CS" runat="server">
            void Page_Load(object sender, System.EventArgs e){}
            protected override void Render(HtmlTextWriter writer)
            {
           // Take over the response writer and send only the results of the selection
           // Turn cacheability off so that each request is viewed as "new"
              Response.Cache.SetCacheability(HttpCacheability.NoCache);
          // For this simple example, just send back plain text.  A more
              sophisticated JSON or XML response could be set here.
            Response.ContentType = "text/plain";
                writer.Write("You selected " + Request.Params["petselection"]);
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
        </div>
        </form>
    </body>
    </html>
    

    マスター・ページは参照されないことに注意してください。マスター・ページは表示されないため、何の意味もありません。ValidateRequest属性がfalseに設定されていることにも注意してください。フォームが予想どおりにポストされないため(複数のパラメータを持っています)、ASP.NETは、この属性のない検証エラーをスローします。最後に、キャッシュがオフになっていることに注意してください。datetimeなどの問合せ文字列パラメータはリクエストに追加できないため、これを一意にする方法はありません。

  5. 続行する前に、コードがコンパイルされることをテストします。

  6. installdir\wsrpdefault\portlets\TestPreferences\UserControl\TestPreferences.ascxファイルを最新バージョンのファイルに置き換えます。

  7. installdir\wsrpdefault\binフォルダ内のコンパイル済アセンブリを置き換えます。

  8. AjaxPostDestination.aspxファイルをinstalldir\wsrpdefault\portlets\TestPreferencesにコピーします。

  9. ポータルに戻って、ポートレットが存在するページをリフレッシュします。これでポートレットには、4つのペットが一覧表示されたリストボックスが表示されます。ペット名をクリックすると、ポートレットの下部にペットの選択が表示されます。

要約すると、ASP.NET 3.5 AJAXコントロールを使用しないでコード内でXMLHttpRequestを使用するには、次のルールに従います。

  • XMLHttpRequestのターゲットURLを、表示されていないアンカー・タグ内にhrefとして配置し(または、表示されていない入力フィールドなどの他の場所を使用し)、次にXMLHttpRequestで送信するターゲットURLとしてそのhrefの値を取得します。

  • ポートレット・コンテンツ変換ルールセットによって変換されるAJAXリクエストからのレスポンスが必要な場合(たとえば、URLをWSRPコンシューマによってプロキシ処理する場合など)、handle問合せ文字列引数を、wsrp-producer.xml内のポートレットに付与したハンドルを参照するターゲットURLに追加します。ルールセットの詳細は、第2.2項「ポートレット・コンテンツ変換ルールセット」を参照してください。

  • querystringパラメータを、データのポスト方法として使用しないでください。POSTパラメータのみを使用してください。

  • リクエストがキャッシュされないように、ターゲット・ページのキャッシュをオフにします。

5.3 ASP.NETアプリケーションの追加

ポートレットがプリファレンスを使用しない場合、Oracle WebCenter WSRP Producer for .NETを使用すると、WSRPを備えたASP.NETアプリケーションを表示することができます。このチュートリアルでは、ASP.NET WebフォームをOracle WebCenter WSRP Producer for .NETに追加します。

  1. 非常に単純なASP.NET Webフォームを作成します。たとえば、次のtest.aspx ファイルは、ASP.NETラベル・コントロールにHello Worldを表示します。

    <%@ Page Language="C#" AutoEventWireup="true" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <script language="CS" runat="server">
            void Page_Load(object sender, System.EventArgs e)
            {
                this.lblTest.Text = "Hello World";
            }
        </script>
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Label ID="lblTest" runat="server" Text=""></asp:Label>
        </div>
        </form>
    </body>
    </html>
    
  2. testASPXフォルダがinstalldir\wsrpdefault\portletsの下に存在しない場合、これを作成します。

  3. 作成したtest.aspxファイルをtestASPXフォルダにコピーします。

  4. 次のようにして、Oracle WebCenter WSRP Producer for .NETマスター・ページを参照するようにASPXファイルを変更します。


    注意:

    Oracle WebCenter WSRP Producer for .NETはマスター・ページを使用してコンテンツを表示することを理解することが重要です。次に概略を示すとおり、ASPXファイルは、マスター・ページの適切なコンテンツ・プレースホルダを参照する必要があります。

    • <head>および<body>の外側にあるすべてのDOM要素を削除します。

    • <head>要素を、wsrpheadで識別されるコンテンツ・プレースホルダに置き換え、<head>要素の必要な子要素を含めます。

      <asp:Content ID="ContentHead1" ContentPlaceHolderID="wsrphead" Runat="Server">
      
    • <body>要素および<form>要素を、Mainで識別されるコンテンツ・プレースホルダに置き換え、<form>要素の必要な子要素を含めます。

      <asp:Content ID="ContentBody1" ContentPlaceHolderID="Main" Runat="Server">
      

    たとえば、変更済のtest.aspxファイルは、次のようになります。

    <%@ Page Language="C#" MasterPageFile="~/portlets/Resources/MasterPages/WSRP.Master" Title="Content Page Test" %>
    <asp:Content ID="ContentHead1" ContentPlaceHolderID="wsrphead" Runat="Server">
    <script language="CS" runat="server">
            void Page_Load(object sender, System.EventArgs e)
            {
                this.lblTest.Text = "Hello World";
            }
        </script>
    </asp:Content>
    <asp:Content ID="ContentBody1" ContentPlaceHolderID="Main" Runat="Server">
    <asp:Label ID="lblTest" runat="server" Text=""></asp:Label>
    </asp:Content>
    
  5. testASPXというポートレット・ハンドルを備えた新しい<portlet>エントリを、wsrp-producer.xmlに作成します。Webフォームはプリファレンスをサポートしていないため、wsrp:edit<portlet-mode>要素を削除します。

  6. wsrp:view<portlet-mode>要素は次のようになります。

    <portlet-mode>
       <name>wsrp:view</name>
       <url>/portlets/testASPX/test.aspx</url>
    </portlet-mode>
    
  7. 新しいtestASPX ポートレットをポータルに追加します。Hello Worldが表示されます。

前述の例では、C#コードは直接ファイル内に配置しました。コードビハインドの.csファイルを使用する場合、単にこのコードを、installdir\wsrpdefaultの下の\App_Codeサブフォルダに追加するか、またはコンパイル済C#アセンブリを installdir\wsrpdefault\binに追加し、アセンブリまたはクラスを参照するようにASPXファイル内の<%@ Pageディレクティブを変更します。

5.4 ヘルプ・ページの追加

ポートレットのヘルプ・ファイルを追加するには、単にヘルプ・ページのHTMLファイルを作成し、ヘルプ・ファイルを指す、wsrp:helpという名前の新しい<portlet-mode>要素を追加します。たとえば、testASPXディレクトリにtestASPXhelp.htmという名前のヘルプ・ページを作成してから、次のように<portlet-modes>要素を更新します。

<portlet-modes>
   <portlet-mode>
    <name>wsrp:view</name>
    <url>/portlets/testASPX/test.aspx</url>
   </portlet-mode>
   <portlet-mode>
    <name>wsrp:help</name>
    <url>/portlets/testASPX/testASPXhelp.htm</url>
   </portlet-mode>
  </portlet-modes>

コンシューマ・ポータル内でポートレットを表示する場合、ポートレットのヘルプ・リンクによってtestASPXhelp.htmページが表示されます。

5.5 マークアップ変換の使用方法

Oracle WebCenter WSRP Producer for .NETでは、マークアップ変換を実装して、ブラウザに表示される前にURLおよび他の静的コンテンツを変更できます。

この項の内容は次のとおりです。

5.5.1 テキストの変換

このチュートリアルでは、第5.3項「ASP.NETアプリケーションの追加」Hello World テキストがHello New Worldと読めるように変更する簡易例を示します。

  1. テキスト・エディタでinstalldir\wsrpdefault\wsrp-producer.xmlファイルを開きます。

  2. ハンドルTestASPXを備えた<portlet>ノードに移動し、<RuleSetRef>要素の下に、次のものを追加します。

    <RewriterConfig>
      <Rules>
       <RewriterRule>
        <LookFor>Hello World</LookFor>
        <ChangeToAbsolute>false</ChangeToAbsolute>
        <ChangeTo>Hello New World</ChangeTo>
        <ApplyTo>*</ApplyTo>
        <MakeResource>false</MakeResource>
       </RewriterRule>
      </Rules>
     </RewriterConfig>
    

    wsrp-producer.xml内のルールセット要素の詳細は、第2.2項「ポートレット・コンテンツ変換ルールセット」を参照してください。

  3. testASPXポートレットを含んでいるポータル・ページをリフレッシュします。これでポートレットには、Hello New Worldが表示されます。

5.5.2 カスタム・ルールセットの作成

このチュートリアルでは、ASP.NET AJAXコントロールの追加時に.NET Frameworkによって生成されるWebResource.axdファイルおよびScriptResource.axdファイルをプロキシ処理するように、第5.2項「ASP.NET AJAXコントロールを備えたWebパーツの追加」のポートレットを変更することによって、カスタムURL変換を示します(wsrp-producer.xmlファイルの上部で定義されるデフォルトのルールセットによって、.NET Frameworkによって生成されるWebリソース・ファイル(*.axd)へのURLは絶対になりますが、WSRPリソースとしてのプロキシ処理は行われません。.axdファイルをプロキシ処理する実際的な理由は、WSRPコンシューマ・ポータル・ユーザーが内部ネットワークのURLにアクセスできないシナリオです)。

  1. テキスト・エディタでinstalldir\wsrpdefault\wsrp-producer.xmlファイルを開きます。

  2. デフォルトのルールセット全体(<RuleSet id="Default">)をコピーし、idの名前をaxdproxyに変更します。

  3. 新しいルールセット内で1番目の<RewriterRule>を検索します。<ApplyTo>要素内に、, .axdを追加します。

  4. 2番目および4番目の<RewriterRule>要素を検索し、それぞれの下の<ApplyTo>要素から,.axdを削除します。

  5. 3番目の<RewriterRule> (<LookFor>(src=\")'を備えています)のコピーを作成します。.axdのみを含むように<ApplyTo>要素を変更し、<MakeResource>trueに変更します。

    完成したルールセットは、次のようになります。

    <RuleSet id="axdproxy">
          <RewriterConfig>
            <Rules>
              <RewriterRule>
                <LookFor>(href=\")([^\"]+)</LookFor>
                <ChangeToAbsolute>true</ChangeToAbsolute>
                <ApplyTo>.aspx,.htm,.html,.axd</ApplyTo>
                <MakeResource>true</MakeResource>
              </RewriterRule>
              <RewriterRule>
                <LookFor>(href=\")([^\"]+)</LookFor>
                <ChangeToAbsolute>true</ChangeToAbsolute>
                <ApplyTo>.css</ApplyTo>
                <MakeResource>false</MakeResource>
              </RewriterRule>
              <RewriterRule>
                <LookFor>(src=\")([^\"]+)</LookFor>
                <ChangeToAbsolute>true</ChangeToAbsolute>
                <ApplyTo>.css,.js,.img,.png,.jpg,.gif</ApplyTo>          
                <MakeResource>false</MakeResource>
              </RewriterRule>
              <RewriterRule>
                <LookFor>(src=\")([^\"]+)</LookFor>
                <ChangeToAbsolute>true</ChangeToAbsolute>
                <ApplyTo>.axd</ApplyTo>          
                <MakeResource>true</MakeResource>
              </RewriterRule>
            </Rules>
          </RewriterConfig>
        </RuleSet>
    
  6. ハンドルTestPreferencesを備えた<portlet>ノードに移動し、新しいaxdproxyルールセット(<RuleSetRef>axdproxy</RuleSetRef>)を参照するように<RuleSetRef>要素を変更します(存在する場合)。<RuleSetRef>要素が存在しない場合は、これを追加します。

  7. 変更内容をwsrp-producer.xmlに保存します。

  8. TestPreferencesポートレットを含んでいるポータル・ページをリフレッシュします。これで.axdを備えたすべてのURLは、WSRPコンシューマ・ポータルによってプロキシ処理されます。これを確認するには、DOM検査ツールを使用して.axdファイルを検索します。これらのファイルは、WSRPコンシューマ・ポータルへのURLで始まるURLエンコード済値に変換されます。これらのURLと、プロキシ処理されていないURLを比較するには、ポートレットの<RuleSetRef>を単にDefaultに切り替えます。

5.6 ポートレット・スタイルの使用方法

Oracle WebCenter WSRP Producer for .NETでは、スキンおよびテーマを適用するための特別な手順を必要としません。スタイル、テーマおよびスキンの管理は、.NET Frameworkに委任されます。たとえば、特定のOracle WebCenter Portalテーマを適用するには、ソースの.cssファイルを\App_Themesフォルダに単に配置し、標準の.NETルールに従って、目的のスタイルを単一コントロール、単一ポートレットまたはポートレット・セットに適用します。

この簡易なチュートリアルでは、組込みのASP.NET機能を使用して、すべてのポートレット内のすべてのラベルにスタイルを適用する方法を示します。詳細は、ASP.NETのテーマおよびスキンに関するMicrosoft社のドキュメントを参照してください。

  1. installdir\wsrpdefault\App_Themesにフォルダを作成し、MyThemeと名前を付けます。

  2. 次の行を含む新しいファイルを作成します。

    <asp:Label runat="server" ForeColor="white" BackColor="green"  />
    
  3. ファイルにmy.skinと名前を付けて、\MyThemeフォルダに保存します。

  4. テキスト・エディタでinstalldir\wsrpdefault\Web.configファイルを開きます。

  5. <pages>要素を検索し、次の属性theme="MyTheme"を追加します。これにより、すべてのASP.NETページは、App_Themes\MyThemeフォルダで定義されているテーマを使用します。

  6. ラベルを含んでいるポートレット(たとえば、前のチュートリアルのポートレットなど)を表示し、背景色が緑であることに注意します。

5.7 JavaScriptを使用したポートレット間通信の使用方法

ポートレット間でデータを渡す最も直接的な方法は、JavaScriptを使用することです。このチュートリアルでは、1つのポートレットを、ユーザーが項目を選択するマスター・ポートレットとして使用するという簡単な方法を示します。項目を選択すると、データが別のポートレットに渡され、項目に関する詳細情報が表示されます。

  1. まず、マスター・ポートレットを作成します。

    Visual StudioでWebアプリケーション・プロジェクトの一環として、新しいWebユーザー・コントロールを作成し、これにMasterList.ascxという名前を付けます。導入を容易にするために、コードを別のファイルに配置しないでください。

  2. ラベルおよびリストボックスを追加しますが、ファイルは空のままにします。ファイルの内容は次のようになります。

    <%@ Control Language="C#" AutoEventWireup="true" %>
    <asp:Label ID="lblHousingType" runat="server" Text="Select House Type"></asp:Label>
    <br/>
    <asp:ListBox ID="listBoxHousing" runat="server" Height="80px" Width="171px">
        <asp:ListItem>Single Family</asp:ListItem>
        <asp:ListItem>Condominium</asp:ListItem>
        <asp:ListItem>Cooperative</asp:ListItem>
        <asp:ListItem>Tenancy in Common</asp:ListItem>
    </asp:ListBox>
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    </script>
    
  3. ファイルの下部に次のJavaScriptを追加します。

    <script type="text/javascript" language="javascript" >
    // Set up an onchange event for listBoxHousing.
    //This can also be done by adding onChange attribute to the asp:ListBox
    var selectmenu;
    var selectMenus = getElementsByTagNameAndEndingId("select", "listBoxHousing");
    selectmenu = selectMenus[0];
    selectmenu.onchange=function()
    {
        // Update a hidden field in another portlet.  This is how information will be passed
        // From one portlet to another.
        var i = selectmenu.selectedIndex;
        var text = selectmenu[i].value;
        var portletFrame = getFrameFromSrcAttribute(window.parent.document, "DetailPage");
        var portletContent = portletFrame.contentWindow;
        portletContent.theForm.submitHousingField.value= text;
        portletContent.theForm.submit();
    }
     
    /*
    This function returns a list of DOM elements that have the tag name specified and
     have an ID that ends in the value supplied.  The reason for this function is that
     ASP.NET prepends control ID's with the webpart zone name and this function
     provides a handy way of locating the our control of interest.
        tagName - DOM tag name to look for (e.g. div, select, p)
        endingID - String that the ID of the DOM elements should end with
        returns - list of DOM elements that have the tag name and have an id that ends with value supplied
    */
    function getElementsByTagNameAndEndingId(tagName, endingId) {
        var tagItems = document.getElementsByTagName(tagName);
        var idValue;
        var idNode;
        var startPos;
        var returnElements = new Array(1);  // Typically only one item
        var j = 0;
        for (i = 0; i < tagItems.length; i++) {
            idNode = tagItems.item(i).attributes.getNamedItem("id");
            if (idNode != null) {
                idValue = idNode.nodeValue;
                startPos = idValue.indexOf(endingId);
            if (startPos > -1 && endingId == idValue.substring(startPos)) {
                returnElements[j] = tagItems.item(i);
                j++;
                }
            }
        }
        return returnElements;
    }
    /* This function finds an iframe based on the src element
    docSource - document element to search in for frame
    srcSearch - string value that should be searched for in an iframe's src field
    returns - iframe element
    */
    function getFrameFromSrcAttribute(docSource, srcSearch) {
        var iFrames = docSource.getElementsByTagName("iframe");
        var srcNode;
        var srcValue;
        var returnFrame;
        for (i = 0; i < iFrames.length; i++) {
            srcNode = iFrames.item(i).attributes.getNamedItem("src");
            if (srcNode != null) {
                srcValue = srcNode.nodeValue;
                startPos = srcValue.indexOf(srcSearch);
                if (srcValue.indexOf(srcSearch) > -1) {
                returnFrame = iFrames.item(i);
                }
            }
        }
        return returnFrame;
    }
    </script>
    

    前述のコードは、リストボックスから選択された項目を受け取り(select DOM要素)、詳細ポートレットを検索して、非表示のフィールドに値を書き込みます。このコードの最も重要な部分は、ポートレットを一意に識別するsrc属性内のテキストに基づいて、ポートレットを含むiFrameを検索することによって、どのように2番目のポートレットを特定するかということです。(この例では、ポートレットが配置されるフォルダ名DetailPageが一意の識別子です。)

  4. 次に、詳細ポートレットを作成します。

    Visual StudioでWebアプリケーション・プロジェクトの一環として、新しいWebユーザー・コントロールを作成し、DetailPage.ascxという名前を付けます。導入を容易にするために、コードを別のファイルに配置しないでください。2つのASP.NETラベルおよび表示されていない1つの入力フィールドを追加します。表示されていないフィールドは、マスター・ポートレットからのデータが配置される場所です。ファイルの内容は次のようになります。

    <%@ Control Language="C#" AutoEventWireup="true" %>
    <asp:Label ID="lblHousing" runat="server" Text="Housing Type Info:"></asp:Label>
    <br/>
    <asp:Label ID="lblHousingTypeInfo" runat="server" Text="None selected"></asp:Label>
    <!-- Use a hidden field to get data from another portlet -->
    <input type="hidden" id="submitHousingField" name="submitHousingField" value=""/>
    
  5. 次のコードをファイルの下部に追加します。

    <script runat="server">
     protected void Page_Load(object sender, EventArgs e)
     {
      if (Request.Params != null)
      {
       if (Request.Params["submitHousingField"] != null)
       {
        string housingType = Request.Params["submitHousingField"].ToString();
        // You'd probably look this up in a database in a real case, but simple switch statement used for simplicity
        switch (housingType)
        {
         case "Single Family":
         {
          lblHousingTypeInfo.Text = "Single family homes consist of a structure and the land.";
          break;
         }
         case "Condominium":
         {
          lblHousingTypeInfo.Text = "You own a condo, but the building housing the condominium is maintained by the home owners association.";
          break;
         }
         case "Cooperative":     {
          lblHousingTypeInfo.Text = "In a Cooperative, you own shares in the corporation that owns the entire building.";
          break;
         }
         case "Tenancy in Common":
         {
          lblHousingTypeInfo.Text = "In a TIC, you own a share of the mortgage on the entire building.";
          break;
         }
        default:
        {
         lblHousingTypeInfo.Text = "Unrecognized housing type selected.";
         break;
        }
       }
      }
     }
    }
    </script>
    

    前述のコードは、表示されていない入力フィールドからformパラメータで渡されるものに基づいて、値をラベルに書き込みます。MasterList.ascxファイルを見なおすと、submitHousingFieldという非表示の入力フィールドが移入されています。(実際の実装では詳細なデータは、ハードコードされるのではなく、データベースから取得されます)。

  6. 次の一連の手順では、前の手順で作成した2つのWebユーザー・コントロールを設定し、Oracle WebCenter WSRP Producer for .NETを使用してこれらのコントロールをポートレットとして表示します。

    installdir\wsrpdefault\portlets\MasterListフォルダを作成します。

  7. 次のコードを含んだdefault.aspxという新しいファイルをフォルダに追加します。

    <%@ Page Language="C#" MasterPageFile="~/portlets/Resources/MasterPages/WSRP.Master" Title="Content Page Test" %>
    <%@ Register src= "~/portlets/MasterList/UserControl/MasterList.ascx" tagname="MasterList" tagprefix="uc1" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="webpartcontrol" Runat="Server">
     <uc1:MasterList ID="MasterList1" runat="server" />
    </asp:Content>
    
  8. installdir\wsrpdefault\portlets\MasterList\UserControlフォルダを作成し、作成したMasterList.ascxファイルをこのフォルダにコピーします。

  9. installdir\wsrpdefault\portlets\DetailPageフォルダを作成し、次のコードを含む、default.aspxという名前のフォルダに新しいファイルを追加します。

    <%@ Page Language="C#" MasterPageFile="~/portlets/Resources/MasterPages/WSRP.Master" Title="Content Page Test" %>
    <%@ Register src= "~/portlets/DetailPage/UserControl/DetailPage.ascx" tagname="DetailPage" tagprefix="uc1" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="webpartcontrol" Runat="Server">
     <uc1:DetailPage ID="DetailPage1" runat="server" />
    </asp:Content>
    
  10. installdir\wsrpdefault\portlets\DetailPage\UserControlフォルダを作成し、作成したDetailPage.ascxファイルをこのフォルダにコピーします。

  11. テキスト・エディタでinstalldir\wsrpdefault\wsrp-producer.xmlを開き、これに<portlet>要素を追加します。(構成ファイルの詳細は、第3章「必要なスクリプト・ファイルの管理」を参照してください。)

    <portlet>
     <handle>HousingType</handle>
     <supported-locale>en</supported-locale>   
     <descriptions>
      <description lang="en">Housing Type</description>
     </descriptions>
     <display-names>
      <display-name lang="en">Housing Type</display-name>
     </display-names>
     <titles>
      <title lang="en">Housing Type</title>
     </titles>
     <short-titles>
      <short-title lang="en">Housing Type</short-title>
     </short-titles>
     <supports>
      <portlet-modes>
       <portlet-mode>
        <name>wsrp:view</name>
        <url>/portlets/MasterList/default.aspx</url>
       </portlet-mode>
      </portlet-modes>
      <mime-type>text/html</mime-type>
     </supports>
    </portlet>
     
    <portlet>
     <handle>HousingDetail</handle>
     <supported-locale>en</supported-locale>   
     <descriptions>
      <description lang="en">Housing Detail</description>
     </descriptions>
     <display-names>
      <display-name lang="en">Housing Detail</display-name>
     </display-names>
     <titles>
      <title lang="en">Housing Detail</title>
     </titles>
     <short-titles>
      <short-title lang="en">Housing Detail</short-title>
     </short-titles>
     <supports>
      <portlet-modes>
       <portlet-mode>
        <name>wsrp:view</name>
        <url>/portlets/DetailPage/default.aspx</url>
       </portlet-mode>
      </portlet-modes>
      <mime-type>text/html</mime-type>
     </supports>
    </portlet>
    
  12. 「スタート」→「プログラム」→「Oracle WebCenter WSRP Producer for .NET」→「WSRP 2.0 WSDL」のショートカットにあるWSDL URLでWSRPコンシューマを指すことによって、Oracle WebCenter WSRP Producer for .NETを登録します。(WSRPプロデューサWSDLの登録方法の詳細は、WSRPコンシューマ・ポータルの製品ドキュメントを参照してください)。

  13. HousingTypeポートレットおよびHousingDetailポートレット(これらはwsrp-producer.xmlファイルで定義されている名前です)をポータルの単一ページに追加します。1つのポートレットでハウジング・タイプをクリックすると、ハウジング・タイプに関する詳細情報が別のポートレットに表示されます。

このチュートリアルでは、ポートレット間通信機能をポートレットに追加するための簡単な1つの方法を示します。

5.8 ユーザー・プロファイル・データの追加

このチュートリアルでは、ユーザー・プロファイル・データを使用するWebパーツを作成します。Webパーツは、System.Web.UI.WebControls.WebParts.WebPartから継承されるクラスとして作成されます。Webユーザー・コントロールを作成して、同じ機能を実行することもできます。両方のオプションに関する詳細は、Microsoft社のドキュメントを参照してください。


重要:

この注意は、WSRPの仕様で定義されているプリファレンスを使用するWSRPコンシューマにとって非常に重要です(Oracle WebCenter Portalを含む)。

ASP.NETは、プロファイル・プロパティの1レベルのみのネストをサポートしていますが(プロパティは<group>の下でのみネストできます)、仕様に定義されている数多くのUserProfile項目は、数レベルの深さでネストされます。たとえば、WSRPの仕様では、ユーザーのビジネス電子メールは、businessInfo/online/emailとして定義され、ユーザーの家庭用携帯電話の内線は、homeInfo/telecom/mobile/numberとして定義されます。これを説明するために、Oracle WebCenter WSRP Producer for .NETは、ネストされたオブジェクトの置換文字としてアンダースコア文字(_)を使用します。これが示されているのは次の手順の中です。ここではbusinessInfo/online/emailは、C#コードではbusinessInfo_online.emailとして処理されますが、Web.configでは次のように参照されます。

<group name="businessInfo_online">
  <add name="email" defaultValue="John.Doe@acme.com"/>
</group>

この問題は、ASP.NETと同じ単一レベルのネスト・ルールに従うため、Oracle WebLogic Portalには該当しません。


  1. Visual Studioで新しいC#クラスを作成し、次のコードをコピーします。

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.Configuration;
     
    using System.Web;
    using System.Web.Profile;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
     
    namespace TestUserProfile
    {
        public class UserProfileWebPart : WebPart
        {
     
            Label lblEmailWLP;
            Label lblEmailWSRP;
            protected override void CreateChildControls()
            {
     
                // Create a label and assign a user profile value.  Try the WLP format and then the standard WSRP format.
                lblEmailWLP = new Label();
                lblEmailWLP.ID = "lblEmailWLP";
                lblEmailWLP.Text = "WLP profile email: " + this.Context.Profile["GroupSpace.email"].ToString();
                this.Controls.Add(lblEmailWLP);
                HtmlGenericControl br1 = new HtmlGenericControl("br");
                this.Controls.Add(br1);
     
                lblEmailWSRP = new Label();
                lblEmailWSRP.ID = "lblEmailWSRP";
                lblEmailWSRP.Text = "WSRP profile email: " + this.Context.Profile["businessInfo_online.email"].ToString();
                this.Controls.Add(lblEmailWSRP);
                HtmlGenericControl br2 = new HtmlGenericControl("br");
                this.Controls.Add(br2);
            }
        }
    }
    
  2. 参照をSystem.Coreに追加して、コードがコンパイルされるのを確認します。

    1. ソリューション・エクスプローラでソリューションを右クリックし、「参照の追加」を選択します。

    2. 「.NET」タブをクリックして、System.Coreまでスクロールします。


      ヒント:

      リスト全体をロードする場合、リストをクリックし、System.Coreと入力すると、リストをスクロールしないで項目を選択できます。

    3. 「OK」をクリックして、新しい参照を受け入れます。

  3. このコードをコンパイルしてTestUserProfileというアセンブリにし、このアセンブリをinstalldir\wsrpdefault\binにコピーします。

  4. installdir\wsrpdefault\Web.configを開き、プロパティ・プロファイルを更新して、コードによって参照されているプロパティ・プロファイルが使用されるようにします。C#コードではプロファイル・プロパティは、group.name形式で指定されることに注意してください。

    <properties>要素を検索し、これを次のものに置き換えます。

    <properties>
      <group name="businessInfo_online">
        <add name="email" defaultValue="John.Doe@acme.com"/>
      </group>
      <group name="GroupSpace">
        <add name="email" defaultValue="John.Doe@acme.com"/>
      </group>
    </properties>
    

    注意:

    この例を動作させるには、デフォルト値が必要です。Oracle WebCenter Portal、またはWSRPの仕様のUserProfile項目を使用する他のWSRPコンシューマでは、GroupSpace.emailプロパティは使用できません。Oracle WebLogic PortalではUserProfile拡張子を使用して項目を渡すため、ネストされたbusinessInfo/online/emailプロファイル・プロパティは作成できません。

  5. installdir\wsrpdefault\portletsの下にTestUserProfileというフォルダを作成します。

  6. default.aspxファイルを、installdir\wsrpdefault\portlets\ASPNET_AJAX_sampleから新しいTestUserProfileフォルダにコピーします。

  7. installdir\wsrpdefault\portlets\TestPreferences\default.aspxファイルを更新して、Simple_Date_Timeコントロールではなく、新しいTestUserProfileアセンブリを参照するようにします。

    1. srcassemblyに置き換え、作成したTestUserProfileアセンブリを参照します。

    2. tagnamenamespaceに置き換え、クラスによって使用されるTestUserProfile名前空間を参照します。

    3. コンテンツ・プレースホルダの下のtagprefixに続く":"の後にクラス名を追加します。

    この結果得られるファイルは次のようになります。

    <%@ Page Language="C#" MasterPageFile="~/portlets/Resources/MasterPages/WSRP.Master" Title="Content Page Test" %>
    <%@ Register assembly="TestUserProfile" namespace="TestUserProfile" tagprefix="uc1" %>
     <asp:Content ID="Content1" ContentPlaceHolderID="webpartcontrol" Runat="Server">
     <uc1:UserProfileWebPart ID="UserProfileWebPart1" runat="server" />
    </asp:Content>
    
  8. installdir\wsrpdefault\wsrp-producer.xmlファイルを更新して、ポートレットおよび使用しているプロファイル・プロパティを含めます。

    1. 既存の<portlet>ノードおよびその内容のコピーを<portlets>要素の下に作成します。

    2. 新しいポートレットのハンドル、表示名、説明、タイトルおよび短い説明という各要素を更新します。

    3. <portlet-mode>要素の下の<url>ノードを更新して、新しいポートレットを指すようにします。(wsrp:editモードおよびwsrp:helpモードは必要ではありません。)

    4. ポートレット内で参照されるプロファイル・プロパティを、<user-profile>要素の下の<profile-item>要素に追加します。

    完了したら、新しい<portlet>ノードは次のようになります。

    <portlet>
     <handle>TestUserProfile</handle>
     <supported-locale>en,fr</supported-locale>   
     <descriptions>
      <description lang="en">Test UserProfile</description>
      <description lang="fr">Test UserProfile</description>
     </descriptions>
     <display-names>
      <display-name lang="en">Test UserProfile</display-name>
      <display-name lang="fr">Test UserProfile</display-name>
     </display-names>
     <titles>
      <title lang="en">Test UserProfile</title>
      <title lang="fr">Test UserProfile</title>
     </titles>
     <short-titles>
      <short-title lang="en">Test UserProfile</short-title>
      <short-title lang="fr">Test UserProfile</short-title>
     </short-titles>
     <supports>
      <portlet-modes>
       <portlet-mode>
        <name>wsrp:view</name>
        <url>/portlets/TestUserProfile/default.aspx</url>
       </portlet-mode>
      </portlet-modes>
      <mime-type>text/html</mime-type>
     </supports>
     <user-profile>
      <profile-item>businessInfo/online/email</profile-item>
      <profile-item>GroupSpace/email</profile-item>
     </user-profile>
    </portlet>
    
  9. これで、ポートレットがWSRPコンシューマで使用可能になります。(第5.1項「ポートレットとしてのWebパーツの追加」で説明したとおり、すでにOracle WebCenter WSRP Producer for .NETを登録しているはずです)。ポートレットをポータルに追加します。Web.Configのプロファイル・プロパティのデフォルト値を示す2つのラベルができます。

  10. ポータルのドキュメントに従って、電子メール・プリファレンスを送信するようにWSRPコンシューマを構成します。

    Oracle WebLogic Portalの場合、次の手順を使用します。(デフォルトのWLP Data Syncは、GroupSpaceというPropertySetを持ち、このPropertySetのプロパティの1つはemailと呼ばれます。)

    1. Oracle WebLogic Portal管理コンソールにログインします。

    2. 「ユーザー、グループおよびロール」「ユーザー管理」を選択します。

    3. Webパーツをテストするために使用してきたユーザーをクリックします。

    4. 「ユーザー・プロファイル」タブをクリックします。

    5. ドロップダウン・メニューから、「GroupSpace」PropertySetを選択します。(このPropertySetが存在しない場合、GroupSpaceという新しいPropertySetを作成し、これにemailというSingle, Unrestrictedプロパティを移入します。)

    6. emailプロパティの値を入力します。

    7. 編集したユーザーでOracle WebLogic Portalにログインし、UserProfile Webパーツ・ポートレットを表示して変更内容を確認します。

5.9 セキュリティ・トークンの設定

デフォルトでは、Oracle WebCenter WSRP Producer for .NETは、SOAPヘッダーで定義されている<wsse:Security>要素を含むXMLを取り出し、これをHttpContext.Itemsコレクションに入れます。トークンは、ASP.NETリクエストの継続期間中のみ使用可能で、ASP.NETセッションIDによって識別されます。

WS-Securityの仕様ではセキュリティ・トークンの構成を可能にする数多くの可能性があるため、Oracle WebCenter WSRP Producer for .NETのインストールには、installdir\wsrpdefault\srcにあるデフォルトのセキュリティ実装用のソース・コードが含まれています。デフォルトのSecurityTokenManagerの実装の詳細は、tokenサブフォルダにあるファイルを参照してください。トークンがデフォルトのSecurityTokenManagerに渡される前に、特にWebCenter Portal WSS 1.0トークンに適用されるデフォルトのリクエスト・フィルタの詳細は、utilサブフォルダにあるファイルを参照してください。

この項では、数多くの方法でセキュリティ・トークンにアクセスする方法を示すいくつかのチュートリアルを提供します。

5.9.1 Webパーツでのトークンの表示

このチュートリアルでは、セキュリティ・トークンを表示する単純なWebパーツを作成します。作成されたWebパーツは汎用的なので、どのタイプのwsse:securityトークンの参照にも使用できます(Oracle WebLogic PortalのSAMLまたはOracle WebCenter PortalのUNTを含む)。Webパーツは、System.Web.UI.WebControls.WebParts.WebPartから継承されるクラスとして作成されます(Webユーザー・コントロールを使用して同じ機能を提供できます)。

  1. Visual Studioで新しいC#クラスを作成します。参照をWSEアセンブリ・コンポーネントMicrosoft.Web.Services2に追加します(そうしないと、サンプル・コードはコンパイルされません)。次のコードをコピーします。

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Text;
    using System.Configuration;
     
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml;
     
    using Microsoft.Web.Services2.Security.Tokens;
     
    namespace SecurityTokenWebPart
    {
        public class SecurityTokenWebPart : WebPart
        {
            Label lblSamlHeader;
            Label lblUntHeader;
            Label lblSecurityHeader;
            Label lblSamlToken;
            Label lblUntToken;
            Label lblSecurityToken;
            protected override void CreateChildControls()
            {
                // Create text label for SAML token
                lblSamlHeader = new Label();
                lblSamlHeader.ID = "lblSamlHeader";
                lblSamlHeader.Text = "SAML token:";
                this.Controls.Add(lblSamlHeader);
                HtmlGenericControl br1 = new HtmlGenericControl("br");
                this.Controls.Add(br1);
     
                // Retrieve the SAML security token associated with this session, if available
                lblSamlToken = new Label();
                lblSamlToken.ID = "lblSamlToken";
                Object item = HttpContext.Current.Items[Page.Session.SessionID + ".SAML_TOKEN"];
                if (item != null)
                {
                    lblSamlToken.Text = HttpUtility.HtmlEncode(HttpUtility.UrlDecode(item.ToString()));
                }
                else
                {
                    lblSamlToken.Text = "SAML token unavailable";
                }
                this.Controls.Add(lblSamlToken);
                HtmlGenericControl br2 = new HtmlGenericControl("br");
                this.Controls.Add(br2);
     
     
                // Create text label for UNT token
                lblUntHeader = new Label();
                lblUntHeader.ID = "lblUntHeader";
                lblUntHeader.Text = "UNT token:";
                this.Controls.Add(lblUntHeader);
                HtmlGenericControl br3 = new HtmlGenericControl("br");
                this.Controls.Add(br3);
     
                // Retrieve the UNT security token associated with this session, if available
                lblUntToken = new Label();
                lblUntToken.ID = "lblUntToken";
                item = HttpContext.Current.Items[Page.Session.SessionID + ".USERNAME_TOKEN"];
                if (item != null)
                {
                    lblUntToken.Text = HttpUtility.HtmlEncode(HttpUtility.UrlDecode(item.ToString()));
                }
                else
                {
                    lblUntToken.Text = "Username token (UNT) unavailable";
                }
                this.Controls.Add(lblUntToken);
                HtmlGenericControl br4 = new HtmlGenericControl("br");
                this.Controls.Add(br4);
     
                // Create text label for security tokens
                lblSecurityHeader = new Label();
                lblSecurityHeader.ID = "lblSecurityHeader";
                lblSecurityHeader.Text = "Security token(s):";
                this.Controls.Add(lblSecurityHeader);
                HtmlGenericControl br5 = new HtmlGenericControl("br");
                this.Controls.Add(br5);
     
                // Retrieve all the security tokens associated with this session, if available
                lblSecurityToken = new Label();
                lblSecurityToken.ID = "lblSecurityToken";
                item = HttpContext.Current.Items[Page.Session.SessionID + ".TOKENS"];
                if (item != null)
                {
                    SecurityTokenCollection tokens = item as SecurityTokenCollection;
                    if (tokens.Count > 0)
                    {
                        foreach (SecurityToken token in tokens)
                        {
                            XmlElement xe = token.GetXml(new XmlDocument());
                            lblSecurityToken.Text += HttpUtility.HtmlEncode(xe.OuterXml);
                        }
                    }
                    else
                    {
                        lblSecurityToken.Text = "Security token unavailable";
                    }
                }
                else
                {
                    lblSecurityToken.Text = "Security token unavailable";
                }
                this.Controls.Add(lblSecurityToken);   
            } 
        }
    
  2. 参照をSystem.webに追加して、コードがコンパイルされるのを確認します。

    1. ソリューション・エクスプローラでソリューションを右クリックし、「参照の追加」を選択します。

    2. 「.NET」タブをクリックして、System.webまでスクロールします。


      ヒント:

      リスト全体をロードする場合、リストをクリックし、System.webと入力すると、リストをスクロールしないで項目を選択できます。

    3. 「OK」をクリックして、新しい参照を受け入れます。

  3. このコードをコンパイルして、ViewSecurityTokenというアセンブリにします。

  4. アセンブリをinstalldir\wsrpdefault\binにコピーします。

  5. installdir\wsrpdefault\portletsの下にViewSecurityTokenというフォルダを作成します。

  6. default.aspxファイルを、installdir\wsrpdefault\portlets\ASPNET_AJAX_sampleから新しいViewSecurityTokenフォルダにコピーします。

  7. installdir\wsrpdefault\portlets\ViewSecurityToken\default.aspxファイルを更新して、Simple_Date_Timeコントロールではなく、新しいTestUserProfileアセンブリを参照するようにします。

    1. srcassemblyに置き換え、作成したViewSecurityTokenアセンブリを参照します。

    2. tagnamenamespaceに置き換え、クラスによって使用されるSecurityTokenWebPart名前空間を参照します。

    3. コンテンツ・プレースホルダの下のtagprefixに続く":"の後にクラス名を追加します。

    この結果得られるファイルは次のようになります。

    <%@ Page Language="C#" MasterPageFile="~/portlets/Resources/MasterPages/WSRP.Master" Title="Content Page Test" %>
    <%@ Register assembly="ViewSecurityToken" namespace="SecurityTokenWebPart" tagprefix="uc1" %>
     <asp:Content ID="Content1" ContentPlaceHolderID="webpartcontrol" Runat="Server">
     <uc1:SecurityTokenWebPart ID="SecurityTokenWebPart1" runat="server" />
    </asp:Content>
    
  8. installdir\wsrpdefault\wsrp-producer.xmlファイルを更新して、ポートレットを含めます。

    1. 既存の<portlet>ノードおよびその内容のコピーを<portlets>要素の下に作成します。

    2. 新しいポートレットのハンドル、表示名、説明、タイトルおよび短い説明という各要素を更新します。

    3. <portlet-mode>要素の下の<url>ノードを更新して、新しいポートレットを指すようにします。(wsrp:editモードおよびwsrp:helpモードは必要ではありません。)

    完了したら、新しい<portlet>ノードは次のようになります。

    <portlet>
     <handle>ViewSecurityToken</handle>
     <supported-locale>en</supported-locale>   
     <descriptions>
      <description lang="en">View SecurityToken</description>
     </descriptions>
     <display-names>
      <display-name lang="en">View SecurityToken</display-name>
     </display-names>
     <titles>
      <title lang="en">View SecurityToken</title>
     </titles>
     <short-titles>
      <short-title lang="en">View SecurityToken</short-title>
     </short-titles>
     <supports>
      <portlet-modes>
       <portlet-mode>
        <name>wsrp:view</name>
        <url>/portlets/ViewSecurityToken/default.aspx</url>
       </portlet-mode>
      </portlet-modes>
      <mime-type>text/html</mime-type>
     </supports>
    </portlet>
    
  9. これで、ポートレットがWSRPコンシューマで使用可能になります。(第5.1項「ポートレットとしてのWebパーツの追加」で説明したとおり、すでにOracle WebCenter WSRP Producer for .NETを登録しているはずです)。ポートレットをポータルに追加します。SAMLトークンまたはUNTトークンを設定していないと想定した場合、ポートレットを表示すると、「セキュリティ・トークン使用不可」が表示されます。

5.9.2 デフォルトのSAMLCredentialMapperV2を使用したOracle WebLogic Portal

Oracle WebCenter WSRP Producer for .NETは、デフォルトでSAMLトークンをリクエストするように構成されています。Oracle WebLogic Portalは、このバージョンのOracle WebCenter WSRP Producer for .NETにデフォルトで準拠しているSAML資格証明マッパー・バージョン(SAMLCredentialMapperV2)を使用して設定されています。このチュートリアルでは、Oracle WebLogic PortalのSAMLトークンを表示する方法を示します。

  1. Oracle WebLogic PortalをホスティングしているOracle WebLogic Serverにログインします。

  2. 「セキュリティ・レルム」→「myrealm」→「プロバイダ」→「資格証明マッピング」の順に移動します。

  3. 「SAMLCredentialMapper」をクリックします。(説明には「Security Assertion Markup Language v1.1」が含まれ、バージョンは「2.0」になります)。

  4. 「プロバイダ固有」タブをクリックし、「署名鍵別名」wsrpconsumerrsaであることに注意することによって、これがデフォルトの設定であることを確認します。

  5. 「管理」タブをクリックした後、「rp_00001」という「リライイング・パーティ」リンクをクリックします。

  6. 「有効」「アサーションの署名」の両方がtrueであることを確認します(両方ともデフォルトではtrueです)。

  7. 「Keyinfoを含める」を選択します。

  8. 「保存」をクリックします。

  9. Oracle WebLogic Serverを再起動します(WebLogic Serverが再起動は必要がないと示している場合でも)。

  10. Oracle WebLogic Portalにログインし、第5.9.1項「Webパーツでのトークンの表示」で作成したポートレットを表示します。ポートレットには、加工していないSAMLセキュリティ・トークンが表示されます。

5.9.3 カスタム署名鍵を使用したOracle WebLogic Portal

前の項では、デフォルトのwsrpconsumerrsa署名鍵別名を使用しました。標準的なSAML設定では、独自の秘密鍵を使用してSAMLアサーションを署名します。この項では、Oracle WebCenter WSRP Producer for .NETによって作成されるWSRPプロデューサを説明するためにSAMLアサーションを作成するための、Oracle WebLogic Portalドキュメントで定義されている手順を調整する方法について説明します。

Oracle WebCenter WSRP Producer for .NET用にリライイング・パーティを構成する場合、次のガイドラインに従います。

  • WSS/Sender-Vouchesを使用してリライイング・パーティを作成します。(WSS/Sender-Vouchesを使用するかぎり、Oracle WebLogic Portalのドキュメントのソース・サイトのフェデレーション・サービスに関する説明は無視してかまいません。)

  • 「アサーションの署名」および「Keyinfoを含める」が選択されていることを確認します。

  • リライイング・パーティがデフォルトの値を使用しない場合(すべてのパーティがこのSAML資格証明マッパーを使用する場合)、WSRPService.wsdlに定義されている.asmxファイルにフルURLを含めます。

5.9.4 Oracle WebLogic Portal用のUNT

このチュートリアルでは、ユーザー名とパスワードを使用してOracle WebLogic PortalのUNTトークンを表示する方法を示します。最初の2つの手順では、登録されたときにOracle WebCenter WSRP Producer for .NETが、ユーザー名およびパスワードを使用してUNTをリクエストするように設定し、残りの手順では、ユーザー名とパスワードを使用してUNTトークンを送信するようにOracle WebLogic Portalを構成します。

  1. テキスト・エディタでinstalldir\wsrpdefault\wsdl\2.0\WSRPService.wsdlファイルを開きます。

  2. SAMLAuth.xmlを参照するwsp:Policy要素を次のものに置き換えます。

    <wsp:Policy s1:Id="UNTAuth.xml">
      <wsp:All>
        <wssp:Identity>
          <wssp:SupportedTokens>
            <wssp:SecurityToken
              TokenType="http://docs.oasis-open.org/wss/2004/01/
              oasis-200401-wss-username-token-profile-1.0#UsernameToken">
              <wssp:UsePassword
                Type="http://docs.oasis-open.org/wss/2004/01/
                oasis-200401-wss-username-token-profile-1.0#PasswordText"/>
            </wssp:SecurityToken>
          </wssp:SupportedTokens>
        </wssp:Identity>
      </wsp:All>
    </wsp:Policy>
    
  3. テキスト・エディタでinstalldir\wsrpdefault\wsdl\2.0\wsrp_v1_bindings.wsdlファイルを開きます。

  4. SAMLAuth.xmlのすべてのインスタンスをUNTAuth.xmlに置き換えます。getMarkupおよびperformBlockingInteractionという名前を持つ<wsdl:input>要素の下に、次のものが表示されます。

    <wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
     <wsp:PolicyReference URI="#UNTAuth.xml"/>
    </wsp:Policy>
    

    注意:

    PolicyReference URI値は、installdir\wsrpdefault\wsdl\2.0\WSRPService.wsdlでUNTに定義されているwsp:Policyの#Idです。

  5. Oracle WebLogic PortalをホスティングしているOracle WebLogic Serverにログインします。

  6. 「セキュリティ・レルム」→「myrealm」→「資格証明マッピング」の順に移動します。

  7. 「新規」をクリックし、マークアップ・エンドポイントを指す設定を入力します。次のもの以外はデフォルトのままにします。

    • プロトコル: http

    • リモート・ホスト: host_name (myproducer.mycompany.comなど)

    • リモート・ポート: host_port (8678など)

    • パス: /wsrpdefault/wsdl/2.0/WSRPBaseService.asmx (これはURL内のホストおよびポートの後のパスです。パスは/で始めてください。)

  8. 「次」をクリックする前に、値が正しいことを確認します。http://host_name:host_port/wsrpdefault/wsdl/2.0/WSRPBaseService.asmxからレスポンスが返されます。

  9. 「次」をクリックします。

  10. ユーザー情報を入力します。

    • ローカル・ユーザー: Oracle WebLogic Serverに登録されているユーザー。たとえばweblogicユーザー。

    • リモート・ユーザー: testuser。ローカル・ユーザーのログイン時にプロデューサに送信されるユーザー。

    • リモート・パスワード: testpassword。ローカル・ユーザーのログイン時にプロデューサに送信されるパスワード

  11. 「終了」をクリックします。

  12. Oracle WebLogic Serverを再起動します(WebLogic Serverが再起動は必要がないと示している場合でも)。

  13. 新しい名前でOracle WebLogic Portalにプロデューサを登録して、ポートレットが、SAMLトークンのかわりにUNTトークンを求めるようにします。

    1. Oracle WebLogic Portal管理コンソールにログインし、第5.9.1項「Webパーツでのトークンの表示」で登録したポートレットを削除します。

    2. 管理コンソールで、1番目のポートレットを登録するために使用したWSRPService.wsdlを指す、新しいWSRPプロデューサを作成します。

    3. 同じポートレットを再び追加します。

    4. 資格証明マッパーに入力したローカル・ユーザーとしてOracle WebLogic Portalにログインし、ポートレットを表示します。ポートレットには、加工されていないUNTセキュリティ・トークンが表示されます。

5.9.5 Oracle WebCenter Portal用のSAML

いくつかのSAMLトークン・プロファイルが、Oracle WebLogic Portalによってサポートされています。Oracle WebCenter WSRP Producer for .NETは、すべてのWSS 1.0オプションをサポートしていますが、WSS 1.1はサポートしていません。このチュートリアルでは、Oracle WebLogic Portalによって提供されているデフォルトに最も似ているSAMLプロファイル(第5.9.3項「カスタム署名鍵を使用したOracle WebLogic Portal」を参照)であるWSS 1.0 SAMLトークン(メッセージIDあり)を使用します。使用可能なセキュリティ・トークン・オプションの詳細は、WSRPプロデューサのセキュリティ設定に関するOracle WebCenter Portalのドキュメントを参照してください。

このチュートリアルでは、Enterprise Managerでこのトークン・プロファイルを設定するプロセスについて説明します。WLSTを使用してWSRPプロデューサを登録する場合、プロデューサを、SAML_TOKEN_WITH_MSG_INTEGRITYトークン・タイプに、および次に説明するEnterprise Managerの設定に対応した他の引数に登録します。チュートリアルの第5.9.1項「Webパーツでのトークンの表示」はすでに終了しています。

  1. java keytoolを使用して、Oracle WebCenter Portalホスト・マシン上で秘密鍵のペアを作成します。鍵アルゴリズムをrsaに、鍵サイズを1024に設定します。

    次に例を示します。

    keytool -genkeypair -keystore mykeystore.jks -storepass mykeystorepass 
    -keyalg RSA -keysize 1024 -alias wckey -keypass wckeypass
    -dname "cn=spaces,dc=example,dc=com" -validity 360
    

    鍵ペアの生成の詳細は、Oracle WebCenter PortalまたはJavaのドキュメントを参照してください。

  2. Enterprise Managerで、「新規ポートレット・プロデューサの追加」ページに移動し、「WSRPプロデューサ」を選択します。

  3. 第5.9.1項「Webパーツでのトークンの表示」で使用した同じWSDLにURLを入力します。

  4. 「セキュリティ」セクションで、トークン・プロファイル「メッセージ整合性付きWSS 1.0 SAMLトークン」を選択します。

  5. 「カスタム」オプションを選択し、「発行者名」を定義します。これには任意の名前を指定できます。

  6. 「デフォルト・ユーザー」(weblogicなど)を指定します。

  7. keytoolで鍵を生成するために使用した値に基づいて、ページの「キーストア」セクションに値を入力します。(暗号化鍵の値は空のままにします。暗号化は使用されないため必要ないためです)。

    • ストア・パス: -keystoreに指定した値を使用します。

    • パスワード: -storepassに指定した値を使用します。

    • 署名鍵の別名: -keyaliasに指定した値を使用します。

    • 署名鍵のパスワード: -keypassに指定した値を使用します。

  8. プロデューサが登録されたら、ViewSecurityTokenポートレットをWebCenter Portalポータルに追加します。WebCenter Portalに(非匿名で)ログインしている場合、ポートレットにはSAMLトークンが表示され、ユーザー名は「アサーション」に入れられます。


    メッセージ保護付きのSAMLに関する注意:

    WSS 1.0 SAML(メッセージ保護あり)を使用する場合は、Windows証明書ストアで秘密鍵を作成し、公開鍵証明書をWebCenter Portalホスト・マシン上のJavaキーストアにインポートする必要があります。証明書をインポートしたら、keytool importコマンドで受信者の別名として使用したkeyaliasを入力します。このようにして、インポートされた証明書は、プロデューサへのメッセージの暗号化に使用されます。

    Windows証明書ストアを管理するプロセスは、次の項(第5.9.6項「Oracle WebCenter Portal用のUNT」)で説明されています。「WSS 1.0ユーザー名トークン(パスワードあり)」のかわりに「メッセージ保護付きWSS 1.0 SAMLトークン」を選択する必要がある点以外、SAMLの場合の手順と同様です。


5.9.6 Oracle WebCenter Portal用のUNT

WebCenter Portalでは、2つの異なるユーザー名トークン(UNT)プロファイルがサポートされています。Oracle WebCenter WSRP Producer for .NETは、これらのオプションの両方をサポートしています。このチュートリアルでは、Oracle WebLogic Portalによって提供されているデフォルトに最も似ているUNTプロファイル(第5.9.4項「Oracle WebLogic Portal用のUNT」を参照)であるWSS 1.0ユーザー名トークン(パスワードあり)の操作について説明します。使用可能なセキュリティ・トークン・オプションの詳細は、WSRPプロデューサのセキュリティ設定に関するWebCenter Portalドキュメントを参照してください。

このチュートリアルでは、Enterprise Managerでこのトークン・プロファイルを設定するプロセスについて説明します。WLSTを使用してWSRPプロデューサを登録する場合、プロデューサを、USERNAME_WITH_PASSWORDトークン・タイプに、および次に説明するEnterprise Managerの設定に対応した他の引数に登録します。チュートリアルの第5.9.1項「Webパーツでのトークンの表示」はすでに終了しています。

  1. Oracle WebCenter WSRP Producer for .NETをホスティングしているWindowsマシンのWindows証明書ストアに、秘密鍵を追加します。次の手順では、LocalMachineのTrustedPeopleストアおよびLocalMachineのPersonalストアに秘密鍵を作成する方法を示しています。Windows証明書ストアの詳細は、Microsoft社のドキュメントを参照してください。

    1. makecert.exeツールを検索します。このツールがない場合は、Microsoft Windows SDK for Windowsおよび.NET Framework 3.5 SP1をダウンロードします。

    2. makecert.exeのPATHの依存関係が使用可能なコマンド・ウィンドウを開きます。Visual Studio 2008がある場合は、「スタート」メニューからVisual Studio 2008コマンド・プロンプトを起動できます。Windows SDKがある場合は、「スタート」メニューの「Microsoft Windows SDK」フォルダからコマンド・シェルを起動できます。

    3. アルゴリズムがsha1に設定された証明書を作成します。

      makecert.exe -a sha1 -n CN=DotNetWSRPProducer -sr LocalMachine -ss My -sky exchange -sk DotNetWSRPProducer
      
  2. 鍵証明書を、Windows証明書ストアのTrustedPeopleストアおよびPersonalストアにインポートします。makecert.exeを実行したときと同じコマンド・ウィンドウを使用して、certmgr.exeを実行します。次に例を示します。

    certmgr.exe -add -c -n DotNetWSRPProducer -s -r LocalMachine My -s -r LocalMachine TrustedPeople
    
  3. Oracle WebCenter WSRP Producer for .NETを実行しているIISアプリケーション用のASP.NETプロセスを実行しているユーザーに証明書に対するセキュリティ権限を付与します(デフォルトでは、これはネットワーク・サービス・ユーザーです)。

    • 管理者バージョンのWSE 2.0 SP3をインストールした場合は、「スタート」メニューから使用可能なX509証明書ツールを使用し、適切なストアから証明書を開いて鍵ファイルのプロパティを表示し、ネットワーク・サービスがフル・コントロールになっていることを確認します。

    • X509証明書ツールがない場合は、%SystemDrive%\ProgramData\Microsoft\Crypto\RSA\MachineKeysに移動し、最新のファイルを見つけ(これらはシステム・ファイルのため、隠しファイルを表示するようにWindows Explorerを構成する必要があります)、ネットワーク・サービス・ユーザーにフル・コントロールを付与することによって、作成した証明書に適切な権限を設定できます。

  4. ストア内で証明書を検索します。

    1. コマンド・ラインからmmc.exeを起動します。

    2. メニュー・バーから、「ファイル」「スナップインの追加と削除」を選択します。

    3. 「証明書」を選択します。

    4. 「追加」をクリックします。

    5. 「コンピュータ アカウント」を選択します(LocalMachineの内容を表示します)。

    6. 「OK」をクリックします。

    7. 左側で証明書リストを展開します。

    8. ストアの「個人」セクションに移動し、追加した証明書を検索します。

  5. 証明書をエクスポートします。

    1. 証明書を右クリックし、「すべてのタスク」「エクスポート」の順に選択します。

    2. ウィザードで、DERエンコード・バイナリとして(DERはjava keytoolで好まれるX509形式です)、好きなファイル名(dnaakey.derなど)を付けて公開鍵をエクスポートします。

  6. java keytoolを使用して、Oracle WebCenter Portalホスト・マシン上で秘密鍵のペアを作成します。鍵アルゴリズムをrsaに、鍵サイズを1024に設定します。次に例を示します。

    C:\Oracle\Middleware\jdk160_20\bin\keytool 
      -genkeypair
      -keystore C:\Oracle\Middleware\keystores\mykeystore.jks
      -storepass mykeystorepass
      -keyalg rsa
      -keysize 1024
      -alias wckey
      -keypass wckeypass
    

    第5.9.5項「Oracle WebCenter Portal用のSAML」をすでに終了している場合は、同じ鍵をこのチュートリアルで使用します。鍵のペアの生成に関する詳細は、WebCenter PortalまたはJavaのドキュメントを参照してください。

  7. .derファイルをWebCenter Portalサーバーにコピーし、java keytoolを使用して鍵をインポートします。次に例を示します。

    C:\Oracle\Middleware\jdk160_20\bin\keytool
      -genkeypair
      -keystore C:\Oracle\Middleware\keystores\mykeystore.jks
      -import
      -storepass mykeystorepass
      -keyalg rsa
      -keysize 1024
      -alias dnaakey
      -keypass dnaakeypass
      -file C:\Oracle\Middleware\keystores\dnaakey.der
    
  8. Enterprise Managerで、「新規ポートレット・プロデューサの追加」ページに移動し、「WSRPプロデューサ」を選択します。

  9. 第5.9.1項「Webパーツでのトークンの表示」で使用した同じWSDLにURLを入力します。

  10. 「セキュリティ」セクションで、トークン・プロファイル「WSS 1.0ユーザー名トークン(パスワードあり)」を選択します。

  11. 「カスタム」オプションを選択します。

  12. 「関連付けられている外部アプリケーション」セクションで、「新規作成」を選択します。新しい外部アプリケーションを作成できる新しいページが表示されます。アプリケーションに名前を付け、「OK」をクリックします。これにより、WebCenter Portalは、WSRPプロデューサ・ポートレットに渡すログイン資格証明を入力するようにエンド・ユーザーに求めるように指示されます。

  13. 「新規ポートレット・プロデューサの追加」ページに戻ったら、keytoolで鍵を生成するために使用した値に基づいて、ページの「キーストア」セクションに値を入力します。(暗号化鍵の値は空のままにします。暗号化は使用されないため必要ないためです)。

    • ストア・パス: -keystoreに指定した値を使用します。

    • パスワード: -storepassに指定した値を使用します。

    • 署名鍵の別名: -alias(これは、キーストアを生成中に指定された別名です。)

    • 署名鍵のパスワード: -keypass(これは、キーストアを生成中に指定された別名のパスワードです。)

    • 受信者の別名: -alias (この値は、鍵の生成時ではなく証明書のインポート(手順6)時に使用した値です。)

  14. プロデューサが登録されたら、ViewSecurityTokenポートレットをWebCenter Portalポータルに追加します。初めてポートレットを表示すると、「ログイン情報の更新」リンクが表示されます。このリンクをクリックし、ユーザー名およびパスワードを入力します。これは、ユーザー名とパスワード・トークン(UNT)にあるポートレットに送信されるユーザー名とパスワードになります。この情報を入力すると、ポートレットには、入力したユーザー名とパスワードとともにトークンが表示されます。

5.10 Oracle WebCenter Portal機能の使用方法

次の機能は、特にOracle WebCenter Portal用に含まれています。これらの機能はWSRP標準に基づいているため、どのWSRPコンシューマにも適用できる可能性があります。

この項の内容は次のとおりです。

5.10.1 Oracle WebCenter Portalのカスタマイズの使用方法

このチュートリアルでは、Oracle WebCenter Portalポータルに表示されるWebパーツ用の「カスタマイズ」オプションを有効にする方法を示します。この例は、第5.1項「ポートレットとしてのWebパーツの追加」で説明したTestPreferencesポートレットから始まります。

  1. テキスト・エディタでinstalldir\wsrpdefault\wsrp-producer.xmlを開きます。

  2. TestPreferencesポートレットを検索し、urn:javax:portlet:mode:custom:edit_defaultsという名前の新しい<portlet-mode>セクションを、<portlet-modes>要素の下に追加します。新しい値が設定された、ポートレットの<supports>要素は、次のようになります。

    <supports>
      <portlet-modes>
       <portlet-mode>
        <name>wsrp:view</name>
        <url>/portlets/TestPreferences/default.aspx</url>
       </portlet-mode>
       <portlet-mode>
        <name>wsrp:edit</name>
        <url>/portlets/TestPreferences/default.aspx</url>
       </portlet-mode>
       <portlet-mode>
        <name>urn:javax:portlet:mode:custom:edit_defaults</name>
        <url>/portlets/TestPreferences/default.aspx</url>
       </portlet-mode>
      </portlet-modes>
      <mime-type>text/html</mime-type>
     </supports>
    
  3. TestPreferencesポートレットをWebCenter Portalポータルに追加し、コンポーザで「カスタマイズ」オプション(レンチ・アイコン)を選択します。

5.10.2 Oracle WebCenter Portalパラメータの使用方法

WSRP 2.0の仕様で定義されているnavigationalParametersを使用して、WebCenter Portalパラメータは、WSRP 2.0プロデューサに渡されます。このチュートリアルでは、WebCenter Portalパラメータをポートレットに渡す方法を示します。

  1. Visual Studioで、第5.1項「ポートレットとしてのWebパーツの追加」で作成したTestPreferences.ascx Webユーザー・コントロールを開きます。

  2. lblParameter1lblParameter2という2つのラベルをフォームの下部に追加します。

    <br />
    <asp:Label ID="lblParameter1" runat="server" Text=""></asp:Label><br />
    <asp:Label ID="lblParameter2" runat="server" Text=" "></asp:Label>
    
  3. 次のコードをPage_Loadメソッドの下部に追加します。

    System.Collections.Generic.Dictionary<string, string> ParameterCollection = HttpContext.Current.Items["NavigationalParameters"] as
    System.Collections.Generic.Dictionary<string, string>;
    lblParameter1.Text = ParameterCollection["TestParameter1"];
    lblParameter2.Text = ParameterCollection["TestParameter2"];
    
  4. コードがコンパイルされることをテストします。特に、System.Collections.Genericが参照されていることを確認します。

  5. App_Codeディレクトリの下にあるTestPreferences.ascxTestPreferences.ascx.cs(およびdesigner .csファイル(いずれかを作成した場合))を更新します。

  6. installdir\wsrpdefault\portlets\TestPreferences.ascxファイルを最新バージョンのファイルに置き換えます。

  7. コンパイルされたアセンブリを、Visual Studioプロジェクトからinstalldir\wsrpdefault\binフォルダにコピーします。

  8. WebCenter Portal WSRPコンシューマにこれらのパラメータの存在を知らせるには、次の手順が必要です。

    1. テキスト・エディタでinstalldir\wsrpdefault\wsrp-producer.xmlを開き、TestPreferences <portlet>要素を検索します。

    2. <supports>要素の上に、次のXMLを追加します。

      <navigational-parameters>
        <parameter>
          <identifier>TestParameter1</identifier>
        </parameter>
        <parameter>
          <identifier>TestParameter2</identifier>
        </parameter>
      </navigational-parameters>
      

      識別子名が、前の手順で説明したPage_Loadメソッドのナビゲーショナル・パラメータ・コレクションから取得した名前と一致することに注意してください。

  9. WebCenterポータル・ページで、コンポーザを開きます。

  10. TestPreferencesポートレットを追加し、「編集」ボタンをクリックします。

    「パラメータ」タブに、定義した2つのパラメータTestParameter1TestParameter2が表示されます。

  11. 各パラメータに値を入力し、「適用」をクリックし、「OK」をクリックします。

    入力した値が、ポートレットの下部に表示されます。


    注意:

    WebCenter Portal WSRPコンシューマは、navigationalParameterの識別子の部分のみを使用します。ただし、navigationParametersを使用する別のWSRPコンシューマがある場合は、説明、ラベルおよびヒントのローカライズされた値をwsrp-producer.xmlに割り当てることもできます。次に例を示します。
    <navigational-parameters>
     <parameter>
      <identifier>TestParameter1</identifier>
      <description>
       <parameter-description lang="en">parameter1-en</parameter-description>
       <parameter-description lang="fr">parameter1-fr</parameter-description>
      </description>
      <label>
       <parameter-label lang="en">parameter1-label-en</parameter-label>
       <parameter-label lang="fr">parameter1-label-fr</parameter-label>
      </label>
      <hint>
       <parameter-hint lang="en">parameter1-hint-en</parameter-hint>
       <parameter-hint lang="fr">parameter1-hint-fr</parameter-hint>
      </hint>
     </parameter>
    </navigational-parameters>