Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

タイムスタンプおよびユーザ名トークンの追加

この章では、タイムスタンプおよびユーザ・トークンについて説明します。以下のトピックについて説明します。

概要

タイムスタンプは、WS-Security ヘッダの <Timestamp> セキュリティ要素です。タイムスタンプは、厳密にはセキュリティ要素ではありません。ただし、リプレイ攻撃を阻止するためにタイムスタンプを使用できます。タイムスタンプは、カスタム・ログにも役に立ちます。

ユーザ名トークンは、WS-Security ヘッダの <UsernameToken> セキュリティ要素で、ユーザ名が保持されます。また、対応するパスワードも保持されます(オプションにてダイジェスト形式で)。つまり、通常、これを認証に使用して、Caché Web クライアントが、パスワードを必要とする Web サービスを使用できるようにします。

Caution:

WS-Security ヘッダ要素は、既定ではクリア・テキストで送信されます。<UsernameToken> のパスワードを保護するには、SSL/TLS を使用するか、パスワード・ダイジェストを使用するか、<UsernameToken> を暗号化するか (このドキュメントで後述)、あるいはこれらの手法を組み合わせて使用する必要があります。

タイムスタンプの追加

WS-Security ヘッダ要素にタイムスタンプを追加するには、Web クライアントまたは Web サービスで次の操作を実行します。

  1. %SOAP.Security.TimestampOpens in a new tabCreate() クラス・メソッドを呼び出します。このメソッドは、オプションの引数 (秒単位の有効期間) を 1 つ取ります。既定の有効期間は 300 秒です。以下はその例です。

     set ts=##class(%SOAP.Security.Timestamp).Create()
    

    このメソッドは、%SOAP.Security.TimestampOpens in a new tab のインスタンスを作成し、その CreatedExpires、および TimestampAtEnd プロパティの値を設定して、インスタンスを返します。このインスタンスは、<Timestamp> ヘッダ要素を表します。

  2. Web クライアントまたは Web サービスの SecurityOut プロパティの AddSecurityElement() メソッドを呼び出します。このメソッドの引数として、作成した %SOAP.Security.TimestampOpens in a new tab インスタンスを使用します。以下はその例です。

     do client.SecurityOut.AddSecurityElement(ts)
  3. SOAP メッセージを送信します。このドキュメントで前述の “セキュリティ・ヘッダ要素の追加” の一般的な手順を参照してください。

<Timestamp> 要素を含める場合は、Caché は、この要素が <Security> 内で最初になるよう強制します。

ユーザ名トークンの追加

ユーザ名トークンを追加するには、Web クライアントで次の操作を実行します。

  1. 必要に応じて、%soap.inc インクルード・ファイルを組み込みます。このファイルには、使用する可能性のあるマクロが定義されています。

  2. %SOAP.Security.UsernameTokenOpens in a new tabCreate() クラス・メソッドを呼び出します。以下はその例です。

     set user="SYSTEM"
     set pwd="_SYS" 
     set utoken=##class(%SOAP.Security.UsernameToken).Create(user,pwd)

    メソッドには、オプションの 3 番目の引数 (type) があり、これはユーザ名トークンにパスワードを含める方法を指定します。これは次のいずれかである必要があります。

    • $$$SOAPWSPasswordText — プレーン・テキストでパスワードを含めます。これが既定値です。

    • $$$SOAPWSPasswordDigest — パスワードを含めず、代わりにパスワードのダイジェストを含めます。ダイジェスト、Nonce、および Created タイム・スタンプは、WS-Security 1.1 で指定されたように導出されます。

    • $$$SOAPWSPasswordNone — パスワードを含めません。

    このメソッドは、%SOAP.Security.UsernameTokenOpens in a new tab のインスタンスを作成し、その Username プロパティおよび Password プロパティを設定して、インスタンスを返します。このオブジェクトは、<UsernameToken> ヘッダ要素を表します。

    Note:

    スタジオ・ウィザードによって作成されたポリシーで必要な <UsernameToken> を作成するためにこの手順を使用する場合、ウィザードは他のトークン・タイプを使用するポリシーを生成しないため、既定タイプ $$$SOAPWSPasswordText を使用する必要があります。ただし、HashPassword アサーションを使用するポリシー ($$$SOAPWSPasswordDigest を使用するポリシー) を手動で作成することができます。

  3. Web クライアントまたは Web サービスの SecurityOut プロパティの AddSecurityElement() メソッドを呼び出します。このメソッドの引数として、作成した %SOAP.Security.UsernameTokenOpens in a new tab インスタンスを使用します。以下はその例です。

     do client.SecurityOut.AddSecurityElement(utoken)
  4. SOAP メッセージを送信します。このドキュメントで前述の “セキュリティ・ヘッダ要素の追加” の一般的な手順を参照してください。

タイムスタンプおよびユーザ名トークンの例

この例では、パスワード認証を必要とする Web サービス、およびその要求メッセージ内でタイムスタンプとユーザ名トークンを送信する Web クライアントを示します。

Caution:

この例では、ユーザ名とパスワードがクリア・テキストで送信されます。

個々の環境でこの例のとおり機能するようにするには、まず次の手順を実行します。

  • Web サービスが属している Web アプリケーションの場合、パスワード認証のみをサポートするように、そのアプリケーションを構成します。

    1. 管理ポータルのホーム・ページで、[システム管理][セキュリティ][アプリケーション][Web アプリケーション] を選択します。

    2. Web アプリケーションを選択します。

    3. [パスワード] オプションのみを選択してから、[保存] を選択します。

  • 既定値を使用していない場合は、該当する Caché ユーザ名とパスワードを使用するように、クライアントを編集します。

Web サービスは、次のとおりです。

Class Tokens.DivideWS Extends %SOAP.WebService
{

Parameter SECURITYIN = "REQUIRE";

///  Name of the Web service.
Parameter SERVICENAME = "TokensDemo";

///  SOAP namespace for the Web service
Parameter NAMESPACE = "http://www.myapp.org";

///  Divide arg1 by arg2 and return the result. In case of error, call ApplicationError.
Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{
  Try {
      Set ans=arg1 / arg2
      }Catch{
      Do ..ApplicationError("division error")
      }
  Quit ans
}

///  Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{
    //details not shown here
}

}

次のクライアント側のクラスは、プロキシ・クライアント (ここには示されていません) を呼び出し、ユーザ名トークンを追加します。

Include %systemInclude

Class TokensClient.UseClient
{

ClassMethod Test() As %Numeric
{
  Set client=##class(TokensClient.TokensDemoSoap).%New()
  
  Do ..AddSecElements(.client)
  Set ans=client.Divide(1,2)
  
  Quit ans
}

ClassMethod AddSecElements(ByRef client As %SOAP.WebClient)
{
   Set utoken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
   Do client.SecurityOut.AddSecurityElement(utoken)

   Set ts=##class(%SOAP.Security.Timestamp).Create()
   Do client.SecurityOut.AddSecurityElement(ts) 
   Quit
}

}

このクライアントからのサンプル・メッセージは、次のようになります。

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope [parts omitted]>
  <SOAP-ENV:Header>
   <Security xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <Timestamp xmlns="[parts omitted]oasis-200401-wss-wssecurity-utility-1.0.xsd">
         <Created>2010-03-12T20:18:03Z</Created>
         <Expires>2010-03-12T20:23:03Z</Expires>
      </Timestamp>
      <UsernameToken>
         <Username>_SYSTEM</Username>
         <Password 
          Type="[parts omitted]#PasswordText">
            SYS
         </Password>
      </UsernameToken>
      </Security>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
      [omitted]
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
FeedbackOpens in a new tab