|
| 注意 : | Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB は Tuxedo 8.1 で非推奨になり、サポートされなくなりました。Oracle Tuxedo CORBA Java クライアントおよび Oracle Tuxedo CORBA Java クライアント ORB のテキスト参照、関連するコード サンプルはすべてサードパーティの Java ORB ライブラリの実装/実行の簡易化とプログラマによる参照だけに使用する必要があります。 |
| 注意 : | サード パーティの CORBA Java ORB のテクニカル サポートは、各ベンダによって提供されます。Oracle Tuxedo では、サード パーティの CORBA Java ORB に関する技術的なサポートやマニュアルは提供していません。 |
| 注意 : | このメカニズムは、Oracle CORBA クライアント アプリケーションで使用します。 |
Oracle Tuxedo CORBA 環境の Bootstrap オブジェクトは機能拡張されており、指定した IIOP リスナ/ハンドラに対するすべての通信を保護するように指定できます。Bootstrap オブジェクトは、IIOP リスナ/ハンドラの場所を指定する際に使用する corbaloc および corbalocs の URL (Uniform Resource Locator) アドレス形式をサポートしています。提供されるセキュリティのタイプは、IIOP リスナ/ハンドラの場所の指定に使用する URL の形式によって異なります。
ホストとポートのアドレス形式の場合、URL アドレス形式を使用して IIOP リスナ/ハンドラの場所を指定しますが、ブートストラップ処理プロセスの動作は異なります。corbaloc または corbalocs URL アドレス形式を使用する場合、IIOP リスナ/ハンドラへの初期接続は、以下のいずれかに分かれます。
corbalocs URL アドレス形式を使用すると、最低限、プリンシパルと IIOP リスナ/ハンドラの間の接続の整合性を保護するために SSL プロトコルが使用されます。
表 9-1 に、2 つの URL アドレス形式の違いを示します。
corbaloc および corbalocs URL アドレス形式は、TCP/IP とドメイン ネーム システム (DNS) の両方の環境で簡単に操作できる文字列化されたオブジェクト参照を提供します。corbaloc および corbalocs URL アドレス形式には、DNS スタイルのホスト名または IP アドレスおよびポートが含まれます。
URL アドレス形式は、Interoperable Naming Service の一部として Object Management Group (OMG) によって適用されたオブジェクト URL の定義に基づいて、その定義を拡張します。Oracle Tuxedo ソフトウェアは、WebLogic Enterprise 製品の旧リリースの機能をサポートすることに加えて、セキュリティ保護された HTTP の URL に従ってモデル化された安全な形式をサポートするために、OMG Interoperable Naming Service で記述された URL 形式も拡張します。
コード リスト 9-1 に、新しい URL アドレス形式の例を示します。
corbaloc://555xyz.com:1024,corbaloc://555backup.com:1022,
corbaloc://555last.com:1999
corbalocs://555xyz.com:1024,(corbalocs://555backup.com:1022|corbalocs://555last.com:1999)
corbaloc://555xyz.com:1111
corbalocs://24.128.122.32:1011, corbalocs://24.128.122.34
Oracle Tuxedo 製品は、異なるスキーマの複数の URL の列挙をサポートする構文を拡張し、OMG Interoperable Naming Service で記述した URL 構文の機能を向上しています。コード リスト 9-2 に、複数の URL を指定する例を示します。
corbalocs://555xyz.com:1024,corbaloc://555xyz.com:1111
corbalocs://ctxobj.com:3434,corbalocs://mthd.com:3434,corbaloc://force.com:1111
コード リスト 9-2 の例では、パーサは、URL corbaloc://force.com:1111 に達すると、安全な接続を試行しなかったものとして内部状態をリセットし、保護されていない接続を試行します。これは、クライアント アプリケーションが Credential オブジェクトで SSL パラメータを設定していない場合に起こります。
以下の節では、Bootstrap オブジェクトの異なるアドレス形式を使用した場合の動作を説明します。
CORBA クライアント アプリケーションが、Bootstrap オブジェクトのホストとポートのアドレス形式を使用する場合、Bootstrap オブジェクトのコンストラクタ メソッドは、指定したホスト名およびポート番号を基にオブジェクト参照を作成します。IIOP リスナ/ハンドラに対する呼び出しは、SSL プロトコルによる保護なしに行われます。
クライアント アプリケーションは、パスワード認証による認証も実行できます。ただし、ブートストラップ処理は非保護および非検証リンクで実行されるので、すべての通信は、以下のセキュリティ攻撃に対して脆弱です。
| 注意 : | IIOP リスナ/ハンドラが SSL プロトコル用にコンフィグレーションされ、Bootstrap オブジェクトのホストとポートのアドレス形式が使用されている場合、指定した CORBA オブジェクトに対する呼び出しによって INVALID_DOMAIN 例外が発生します。 |
デフォルトでは、corbaloc URL アドレス形式およびパスワード認証を使用する場合に、IIOP リスナ/ハンドラに対する呼び出しは保護されていません。したがって、すべての通信は、以下のセキュリティ攻撃に対して脆弱です。
corbaloc URL アドレス形式を使用する際に、SecurityLevel2::PrincipalAuthenticator::authenticate() メソッドを使用して、証明書による認証を使用するように指定し、Credentials オブジェクトの invocation_methods_required メソッドを呼び出して、ブートストラップ処理を保護できます。
| 注意 : | IIOP リスナ/ハンドラが SSL プロトコル用にコンフィグレーションされているものの、証明書による認証用にコンフィグレーションされておらず、corbaloc URL アドレス形式が使用されている場合、指定した CORBA オブジェクトに対する呼び出しによって INVALID_DOMAIN 例外が発生します。 |
既存の CORBA アプリケーションを、ホストとポートのアドレス形式ではなく corbaloc URL 形式に移行することをお勧めします。
corbalocs URL アドレス形式は、プリンシパルと IIOP リスナ/ハンドラの間の通信を保護する場合に推奨される形式です。corbalocs URL アドレス形式は、corbaloc URL アドレス形式とほぼ同じように機能しますが、使用する認証のタイプに関係なく、IIOP リスナ/ハンドラまたは CORBA C++ ORB を使用した通信を保護するために SSL プロトコルを使用する点が異なります。
デフォルトを corbalocs URL アドレス形式で使用する場合、通信は、サービス拒否攻撃に対してのみ脆弱です。SSL プロトコルおよび証明書による認証を使用すると、スニッファ、改ざん、リプレイ攻撃を防ぐことができます。さらに、デジタル証明書で指定したホストの検証によって、介在者の攻撃も防ぐことができます。
corbalocs URL アドレス形式を使用するには、SSL プロトコルの使用を有効にするように IIOP リスナ/ハンドラまたは CORBA C++ ORB をコンフィグレーションする必要があります。IIOP リスナ/ハンドラまたは CORBA C++ ORB を SSL プロトコル用にコンフィグレーションする際の詳細については、「SSL プロトコルのコンフィグレーション」を参照してください。
ここでは、CORBA アプリケーションでのパスワード認証の実装について説明します。
Security サンプル アプリケーションでは、パスワード認証を使用します。Security サンプル アプリケーションでは、アプリケーションを使用している学生が固有の ID とパスワードを持っている必要があります。Security サンプル アプリケーションは、以下のように動作します。
Registrar オブジェクトの get_student_details() メソッドを実装し、学生に関する情報を返します。ユーザが認証され、ログオンが完了すると、get_student_details() メソッドは、データベース内の学生の情報にアクセスし、クライアントのログオン メソッドが必要とする学生の情報を取得します。
図 9-1 に、Security サンプル アプリケーションを示します。

Security サンプル アプリケーションのソース ファイルは、Oracle Tuxedo ソフトウェアの \samples\corba\university ディレクトリにあります。Security サンプル アプリケーションのビルドと実行の詳細については、『Tuxedo CORBA University サンプル アプリケーション』を参照してください。
パスワード認証を使用する場合、以下を実行するクライアント アプリケーション コードを記述します。
SecurityLevel2::PrincipalAuthenticator インタフェースは、CORBA サービス セキュリティ サービス仕様で定義されます。このインタフェースには、プリンシパルの認証に使用する 2 つのメソッドがあります。メソッドが 2 つあるのは、プリンシパルの認証では複数の手順を必要とする可能性があるからです。authenticate() メソッドでは、呼び出し側は、認証を行い、必要に応じてこのセッションのプリンシパルの属性を選択できます。
CORBA 環境は、Oracle Texudo 製品の ATMI 環境にあるものと同様のセキュリティをサポートする機能で PrincipalAuthenticator オブジェクトを拡張します。拡張機能は、Tobj::PrincipalAuthenticator インタフェースによって提供されます。
Tobj::PrincipalAuthenticator インタフェース用に定義されたメソッドは、同等の CORBA 定義のインタフェースの特化および単純化した形式を提供します。CORBA アプリケーションを開発する場合、CORBA 定義の拡張か Oracle Tuxedo 拡張のいずれかを使用できます。
Tobj::PrincipalAuthenticator インタフェースは、SecurityLevel2::PrincipalAuthenticator インタフェースと同じ機能を提供します。ただし、SecurityLevel2::PrincipalAuthenticator::authenticate() メソッドとは異なり、Tobj::PrincipalAuthenticator インタフェースの logon() メソッドは、Credentials オブジェクトを返しません。結果として、複数のプリンシパル ID を使用する CORBA アプリケーションでは、ログオンの結果として Credentials オブジェクトを取り出す logon() メソッドの直後に Current::get_credentials() メソッドを呼び出す必要があります。ログオン メソッドの直後の Credentials オブジェクトの取得は、シリアライズされたアクセスで保護する必要があります。
| 注意 : | ログオンの一部として指定したユーザ データには、NULL を含めることはできません。 |
次の節には、パスワード認証の実装を示す C++ のサンプル コードがあります。Visual Basic のサンプル コードについては、「オートメーション セキュリティ リファレンス」を参照してください。
コード リスト 9-3 には、SecurityLevel2::PrincipalAuthenticator::authenticate() メソッドを使用してパスワード認証を実行する C++ サンプル コードがあります。
...(orb,
// Bootstrap オブジェクトを作成
Tobj_Bootstrap* bootstrap = new Tobj_Bootstrap
corbalocs://sling.com:2143);
// SecurityCurrent オブジェクトを取得
CORBA::Object_var var_security_current_oref =
bootstrap.resolve_initial_references(“SecurityCurrent”);
SecurityLevel2::Current_var var_security_current_ref =
SecurityLevel2::Current::_narrow(var_security_current_oref.in());
// PrincipalAuthenticator を取得
SecurityLevel2::PrincipalAuthenticator_var var_principal_authenticator =
var_security_current_oref->principal_authenticator();
const char * user_name = “john”
const char * client_name = “university”;
char system_password[31] = {`\0’};
char user_password[31] = {`\0’};
Tobj::PrincipalAuthenticator_ptr var_bea_principal_authenticator =
Tobj::PrincipalAuthenticator::_narrow(var_bea_principal_authenticator.in());
// セキュリティ レベルを指定
Tobj::AuthType auth_type = var_bea_principal_authenticator->get_auth_type();
switch (auth_type)
{
case Tobj::TOBJ_NOAUTH;
break;
case Tobj::TOBJ_SYSAUTH
strcpy(system_password, “sys_pw”);
case Tobj::TOBJ_APPAUTH
strcpy(system_password, “sys_pw”);
strcpy(user_password, “john_pw”);
break;
}
if (auth_type != Tobj::TOBJ_NOAUTH)
{
SecurityLevel2::Credentials_var creds;
Security::Opaque_var auth_data;
Security::AttributeList_var privileges;
Security::Opaque_var cont_data;
Security::Opaque_var auth_spec_data;
var_bea_principalauthenticator->build_auth_data(user_name,
client_name,
system_password,
user_password,
NULL,
auth_data,
privileges);
Security::AuthenticationStatus status =
var_bea_principalauthenticator->authenticate(
Tobj::TuxedoSecurity,
user_name,
auth_data,
privileges,
creds,
cont_data, auth_spec_data);
if (status != Security::SecAuthSuccess)
{
// 認証に失敗
return;
}
}
// アプリケーションに進む
...
コード リスト 9-4 には、Tobj::PrincipalAuthenticator::logon() メソッドを使用してパスワード認証を実行する C++ サンプル コードがあります。
...CORBA::Object_var var_security_current_oref =
bootstrap.resolve_initial_references(“SecurityCurrent”);
SecurityLevel2::Current_var var_security_current_ref =
SecurityLevel2::Current::_narrow(var_security_current_oref.in());
// PrincipalAuthenticator を取得
SecurityLevel2::PrincipalAuthenticator_var var_principal_authenticator_oref =
var_security_current_oref->principal_authenticator();// PrincipalAuthenticator をナロー変換
Tobj::PrincipalAuthenticator_var var_bea_principal_authenticator =
Tobj::PrincipalAuthenticator::_narrow
var_principal_authenticator_oref.in());
const char * user_name = “john”
const char * client_name = “university”;
char system_password[31] = {`\0’};
char user_password[31] = {`\0’};
// セキュリティ レベルを指定
Tobj::AuthType auth_type = var_bea_principal_authenticator->get_auth_type();
switch (auth_type)
{
case Tobj::TOBJ_NOAUTH;
break;
case Tobj::TOBJ_SYSAUTH
strcpy(system_password, “sys_pw”);
case Tobj::TOBJ_APPAUTH
strcpy(system_password, “sys_pw”);
strcpy(user_password, “john_pw”);
break;
}
if (auth_type != Tobj::TOBJ_NOAUTH)
{
SecurityLevel2::Credentials_var creds;
Security::Opaque_var auth_data;
Security::AttributeList_var privileges;
Security::Opaque_var cont_data;
Security::Opaque_var auth_spec_data;
// セキュリティ レベルを指定
Tobj::AuthType auth_type = var_bea_principal_authenticator->get_auth_type();
Security::AuthenticationStatus status = var_bea_principal_authenticator->logon(
user_name,
client_name,
system_password,
user_password,
0);
if (status != Security::SecAuthSuccess)
{
// 認証に失敗
return;
}
}// アプリケーションに進む
...// ログオフ
try
{
logoff();
}...
ここでは、CORBA アプリケーションでの証明書による認証の実装について説明します。
Secure Simpapp サンプル アプリケーションは、既存の Simpapp サンプル アプリケーションを使用し、SSL プロトコルおよび証明書による認証で保護された通信をサポートするようにコードおよびコンフィグレーション ファイルを変更します。
Secure Simpapp サンプル アプリケーションのサーバ アプリケーションは、以下の 2 つのメソッドを持つ CORBA オブジェクトの実装を提供します。
Simpapp サンプル アプリケーションは、証明書による認証と SSL プロトコルをサポートするために以下のように変更されました。
UBBCONFIG ファイルの ISL セクションで、IIOP リスナ/ハンドラに対して SSL プロトコルをコンフィグレーションするために、ISL コマンドの -a、-S、-z、および -Z オプションが指定されています。UBBCONFIG ファイルの ISL セクションでは、IIOP リスナ/ハンドラに対する証明資料を指定するために、SEC_PRINCIPAL_NAME、SEC_PRINCIPAL_LOCATION、および SEC_PRINCIPAL_PASSVAR パラメータが定義されています。corbalocs URL アドレス形式を使用します。SecurityLevel2::PrincipalAuthenticator インタフェースの authenticate() メソッドを使用し、プリンシパルを認証して、プリンシパルの資格を取得します。
C++ Secure Simpapp サンプル アプリケーションのソース ファイルは、Oracle Tuxedo ソフトウェアの \samples\corba\simpappSSL ディレクトリにあります。Secure Simpapp サンプル アプリケーションのビルドと実行の手順については、「CORBA サンプル アプリケーションのビルドと実行」を参照してください。
証明書による認証を使用する場合、以下を実行するクライアント アプリケーション コードを記述します。
corbalocs URL アドレス形式を使用します。SecurityLevel2::PrincipalAuthenticator インタフェースの authenticate() メソッドを使用し、プリンシパルを認証して、プリンシパルの資格を取得します。証明書による認証を使用する場合、method 引数に Tobj::CertificateBased を指定し、Security::Opaque の auth_data 引数としてプライベート キーのパス フレーズを指定します。
次の節には、証明書による認証の実装を示す C++ のサンプル コードがあります。
コード リスト 9-5 に、CORBA C++ クライアント アプリケーションでの証明書による認証の使い方を示します。
....
// ORB を初期化
CORBA::ORB_var v_orb = CORBA::ORB_init(argc, argv, "");
// bootstrap オブジェクトを作成
Tobj_Bootstrap bootstrap(v_orb.in(), corbalocs://sling.com:2143);
// SecurityCurrent を解決
CORBA::Object_ptr seccurobj =
bootstrap.resolve_initial_references("SecurityCurrent");
SecurityLevel2::Current_ptr seccur =
SecurityLevel2::Current::_narrow(seccurobj);
// 証明書ベースの認証を実行
SecurityLevel2::Credentials_ptr the_creds;
Security::AttributeList_var privileges;
Security::Opaque_var continuation_data;
Security::Opaque_var auth_specific_data;
Security::Opaque_var response_data;
//プリンシパルの電子メール アドレス
char emailAddress[] = “milozzi@bigcompany.com;”
// プリンシパルのデジタル証明書のパス フレーズ
char password[] = “asdawrewe98infldi7;”
// 証明書プライベート キー パスワードを非透過的に変換
unsigned long password_len = strlen(password);
Security::Opaque ssl_auth_data(password_len);
// Principal Authenticator でプリンシパルの証明書を認証
for(int i = 0; (unsigned long) i < password_len; i++)
ssl_auth_data[i] = password[i];
Security::AuthenticationStatus auth_status;
SecurityLevel2::PrincipalAuthenticator_var PA =
seccur->principal_authenticator();
auth_status = PA->authenticate(Tobj::CertificateBased,
emailAddress,
ssl_auth_data,
privileges,
the_creds,
continuation_data,
auth_specific_data);
while(auth_status == Security::SecAuthContinue) {
auth_status = PA->continue_authentication(
response_data,
the_creds,
continuation_data,
auth_specific_data);}
...
| 注意 : | このメカニズムは、サード パーティのクライアント ORB で使用します。 |
Interoperable Naming Service メカニズムを使用し、適切な資格で Oracle Tuxedo ドメインにアクセスするには、次の手順を実行します。
ORB::resolve_initial_references() オペレーションを使用して、Oracle Tuxedo ドメインの SecurityLevel2::PrincipalAuthenticator オブジェクトを取得します。SecurityLevel2::PrincipalAuthenticator オブジェクトは、固有の Oracle 委譲型インタフェースではなく、標準 CORBA サービス セキュリティ サービスに従い、認証プリンシパルを目的としたメソッドが含まれます。SecurityLevel2::PrincipalAuthenticator オブジェクトの authenticate() メソッドを使用して、Oracle Tuxedo ドメインにアクセスし、そのドメインに対してクライアント ORB を認証します。Oracle Tuxedo ドメインへのアクセスにセキュリティ資格が必要な場合、authenticate() メソッドは、引き続き認証が必要であることを示す状態を返します。SecurityLevel2::PrincipalAuthenticator オブジェクトの continue_authentication() メソッドを使用し、暗号化されたログオンと資格情報を Oracle Tuxedo ドメインに渡します。
CORBA Interoperable Naming Service (INS) メカニズム使用の詳細については、「CORBA ブートストラップ処理のプログラミング リファレンス」の SecurityLevel2::PrincipalAuthenticator インタフェースの項目を参照してください。
以下では、認証を続行する前にクライアント資格を保護する例について説明します。
次の例では、J2SE v 1.4 を使用する Java クライアントが Oracle Tuxedo アプリケーションにアクセスするものとします。
$TUXDIR/udataobj/java/jdk/tuxsecenv.jar を CLASSPATH に追加します。 com.bea.protectLogonData() を呼び出し、次に PrincipalAuthenticator continue_authentication() メソッドを呼び出します。 protectLogonData() 呼び出しを示したものです。このコードは、$TUXDIR/include: security.idl, lcs.idl, ns.idl, tobj.idl の IDL ファイルから生成される Java クラスに依存します。 try {
// ORB を初期化
ORB orb = ORB.init(args, null);
// 認証
org.omg.CORBA.Object sec_obj =
orb.resolve_initial_references("PrincipalAuthenticator");
org.omg.SecurityLevel2.PrincipalAuthenticator pa =
org.omg.SecurityLevel2.PrincipalAuthenticatorHelper.narrow(sec_obj);
String userName = "geni";
String clientName = "SimpleClient";
org.omg.Security.SecAttribute[] privilege =
new org.omg.Security.SecAttribute[1];
org.omg.SecurityLevel2.CredentialsHolder myCreds =
new org.omg.SecurityLevel2.CredentialsHolder();
org.omg.Security.OpaqueHolder cont_data = // 継続データ
new org.omg.Security.OpaqueHolder();
org.omg.Security.OpaqueHolder auth_data = // 特定のデータを認証
new org.omg.Security.OpaqueHolder();
org.omg.Security.AuthenticationStatus status = pa.authenticate(
1,
userName,
clientName.getBytes(),
privilege,
myCreds,
cont_data,
auth_data
);
if (status.value() == 2) {
// さらに認証が必要
org.omg.SecurityLevel2.Credentials creds = myCreds.value;
String secUid = new String(cont_data.value);
org.omg.Security.OpaqueHolder cont_data_2 =
new org.omg.Security.OpaqueHolder();
org.omg.Security.OpaqueHolder auth_data_2 =
new org.omg.Security.OpaqueHolder();
org.omg.Security.OpaqueHolder opqholder =
new org.omg.Security.OpaqueHolder();
byte[] ba0 = new byte[0];
String userPasswd = new String("abc123");
String domainPasswd = new String("abc123");
// ログオン データを暗号化
com.bea.LogonData td = new com.bea.LogonData();
int rc = td.protectLogonData(
userName,
clientName,
domainPasswd,
userPasswd,
secUid,
ba0,
opqholder
);
// 認証を続行
status = pa.continue_authentication(
opqholder.value,
creds,
cont_data_2,
auth_data_2
);
}
else {
System.out.println("No security required");
}
.
.
.
証明書による認証を使用する場合、プリンシパルで必要なセキュリティ属性を定義しなければならない場合があります。たとえば、銀行取引アプリケーションでは、データをデータベースに転送する前に、特定のセキュリティ要件を満たさなければならない可能性があります。SecurityLevel2::Credentials インタフェースの invocation_options_required() メソッドを使用すると、プリンシパルは、SSL 接続のセキュリティ特性を明示的に制御できるようになります。corbaloc URL アドレス形式を使用する場合、SecurityLevel2::Credentials インタフェースの authenticate() メソッドと invocation_options_required() メソッドを使用し、ブートストラップ処理をセキュリティで保護できます。
invocation_options_required() メソッドを使用するには、次の手順を実行します。
SecurityLevel2::PrincipalAuthenticator オブジェクトの authenticate() メソッドを使用するアプリケーション コードを記述し、証明書による認証が使用されるようにします。invocation_options_required() メソッドを使用して、プリンシパルで必要なセキュリティ属性を指定します。セキュリティ オプションのリストについては、「C++ セキュリティ リファレンス」の invocation_options_required() メソッドの項目および「Java セキュリティ リファレンス」を参照してください。
コード リスト 9-7 では、invocation_options_required() メソッドを使用した C++ の例を示します。
// ORB を初期化
CORBA::ORB_var v_orb = CORBA::ORB_init(argc, argv, "");
// bootstrap オブジェクトを作成
Tobj_Bootstrap bootstrap(v_orb.in(), corbalocs://sling.com:2143);
// SecurityCurrent を解決
CORBA::Object_ptr seccurobj =
bootstrap.resolve_initial_references("SecurityCurrent");
SecurityLevel2::Current_ptr seccur =
SecurityLevel2::Current::_narrow(seccurobj);
// 証明書ベースの認証を実行
SecurityLevel2::Credentials_ptr the_creds;
Security::AttributeList_var privileges;
Security::Opaque_var continuation_data;
Security::Opaque_var auth_specific_data;
Security::Opaque_var response_data;
//プリンシパルの電子メール アドレス
char emailAddress[] = “milozzi@bigcompany.com;”
// プリンシパルのデジタル証明書のパス フレーズ
char password[] = “asdawrewe98infldi7;”
// 証明書プライベート キー パスワードを非透過的に変換
unsigned long password_len = strlen(password);
Security::Opaque ssl_auth_data(password_len);
// Principal Authenticator でプリンシパルの証明書を認証
for(int i = 0; (unsigned long) i < password_len; i++)
ssl_auth_data[i] = password[i];
Security::AuthenticationStatus auth_status;
SecurityLevel2::PrincipalAuthenticator_var PA =
seccur->principal_authenticator();
auth_status = PA->authenticate(Tobj::CertificateBased,
emailAddress,
ssl_auth_data,
privileges,
the_creds,
continuation_data,
auth_specific_data);
the_creds->invocation_options_required(
Security::Integrity|
Security::DetectReplay|
Security::DetectMisordering|
Security::EstablishTrustInTarget|
Security::EstalishTrustInClient|
Security::SimpleDelegation);
while(auth_status == Security::SecAuthContinue) {
auth_status = PA->continue_authentication(
response_data,
the_creds,
continuation_data,
auth_specific_data);}
|