呼び出し元パートのある UsernameToken を WebSphere Application Server レジストリーにアクセスせずに認証するために、
UsernameToken コンシューマーの認証方式を置き換え、代替 Java™ Authentication
and Authorization Service (JAAS) ログイン構成を使用するように呼び出し元を構成することができます。
このタスクについて
この情報は、Java API for XML-based RPC (JAX-RPC) Web サービスにのみ該当します。
デフォルトでは、
Web Services Security UsernameToken コンシューマーと共に使用されるデフォルト JAAS ログイン・モジュールである UsernameLoginModule は、
トークン内に含まれているユーザー名とパスワードを常に WebSphere レジストリーに照らして検証します。カスタム・プロパティーを構成することによって、
このレジストリー検査を回避することができます。サービス・プロバイダーの WS-Security 制約に呼び出し元パートが追加されると、
UsernameToken に含まれているユーザー名とパスワードも WebSphere レジストリーに照らして検証されます。
この検証は、以下の例のように、system.DEFAULT Java Authentication
and Authorization Service (JAAS) 構成スタックの一部である com.ibm.ws.security.server.lm.ltpaLoginModule モジュールで
発生します。
com.ibm.ws.security.server.lm.ltpaLoginModule
com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule
WebSphere Application Server WS-Security ランタイムは、
上の 2 つのログイン・モジュールを含んでいない JAAS 構成を呼び出し元パートに対して使用することをサポートしていません。ただし、
独自のカスタム・ログイン・モジュールをこの JAAS 構成スタックに追加することが可能です。
WebSphere Application Server
レジストリーへアクセスせずに、呼び出し元パートのある UsernameToken を使用するには、UsernameLoginModule モジュールと ltpaLoginModule モジュールの両方でレジストリーへのアクセスを防止する必要があります。
注: 何らかのアプリケーション開発ツールのウィザードを使用して UsernameToken がプロバイダー・アプリケーションに追加されると、
UsernameToken の呼び出し元パートが自動的に追加されます。
呼び出し元パートは、UsernameToken からの ID が実行スレッドにあるようにしたい場合のみ必要です。UsernameToken からの ID が実行スレッドにあることをアプリケーションが必要としない場合は、
呼び出し元パートは不要であり、削除することができます。呼び出し元パートは、デプロイメント記述子拡張内に構成され、
アプリケーション開発ツールを使用することでのみアクセスできます。
IBM Rational Application Developer インフォメーション・センター
の『コンシューマー・セキュリティー制約での呼び出し元の構成』を参照してください。
- UsernameLoginModule モジュールがレジストリーにアクセスするのを防止するため、
com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck カスタム・プロパティーを
UsernameToken コンシューマーの JAAS 構成に追加します。
このカスタム・プロパティーは、以下の 2 つの方法のいずれかで追加できます。
トラブルの回避 (Avoid trouble): wssecurity.UsernameToken JAAS 構成をこのように更新すると、
アプリケーション・サーバー上のこの JAAS 構成のすべてのユーザーがレジストリーを検査しなくなります。このような動作を望まない場合は、
新しい JAAS 構成を作成するか、UsernameToken コンシューマーを更新する方法を使用してください。
gotcha
このカスタム・プロパティーを wssecurity.UsernameToken JAAS 構成内の com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule モジュールに追加するには、
次のようにします。
- 「セキュリティー」>「グローバル・セキュリティー」とクリックします。
- 「認証」の下で、「Java 認証・承認サービス」>「システム・ログイン」をクリックします。
- wssecurity.UsernameToken を選択します。
- com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule を選択します。
- カスタム・プロパティー com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true を追加します。
- 「OK」をクリックします。
- 更新された JAAS 構成を再ロードするために、アプリケーション・サーバーを再始動します。
カスタム・プロパティーをアプリケーションのトークン・コンシューマーに追加するには、以下のステップを実行します。
- 「アプリケーション」>「アプリケーション・タイプ」>「WebSphere エンタープライズ・アプリケーション」> (providerAppName) >「モジュールの管理」> (moduleName) >「Web サービス: サーバー・セキュリティー・バインディング」とクリックします。
- 「要求コンシューマー (受信側) バインディング」の下で、
「カスタムの編集」>「トークン・コンシューマー」をクリックします。
- UsernameToken コンシューマーを選択します。
- 「JAAS 構成」>「プロパティー」>「新規」をクリックします。
- カスタム・プロパティー com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true を追加します。
- 「OK」をクリックします。
- 「保存」をクリックします。
- アプリケーションを再始動します。
注: UsernameToken コンシューマーの名前が「Token_123」のような名前で、選択可能ではない場合、
セキュリティー制約を追加するために使用したアプリケーション開発ツールは、
デプロイメント記述子内でトークン・コンシューマーに名前を付けるのに失敗しました。代わりに、以下の 2 つのオプションのいずれかを実行できます。
- ステップ 1 に記述されているように、セキュリティー JAAS 構成にプロパティーを追加します。
- アプリケーション・プロジェクトのデプロイメント記述子バインディングをアプリケーション開発ツールを使用して編集します。
IBM Rational Application Developer インフォメーション・センター
の『コンシューマー・セキュリティー制約におけるセキュリティー・トークン要件の構成』を参照してください。
- com.ibm.ws.security.server.lm.ltpaLoginModule の上にスタックする JAAS ログイン・モジュールを開発します。以下の例は、JAAS ログイン・モジュールのサンプル・コードを示しています。
package test.tokens;
import java.util.Map;
import java.util.Hashtable;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import com.ibm.wsspi.wssecurity.auth.token.UsernameToken;
import com.ibm.wsspi.security.token.AttributeNameConstants;
public class MyAuthLoginModule implements LoginModule {
private Map _sharedState = null;
private CallbackHandler _callbackHandler = null;
Subject _subject = null;
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {
this._sharedState = sharedState;
this._callbackHandler = callbackHandler;
this._subject = subject;
}
public boolean login() throws LoginException {
//For the sake of readability, this login module does not
//protect against all NPE's
String username = null;
char [] password = null;
NameCallback nameCallback = null;
PasswordCallback passwordCallback = null;
//Get the username and password from callbacks that
//the ws-security runtime set up
Callback[] callbacks = new Callback[2];
callbacks[0] = nameCallback = new NameCallback("Username: ");
callbacks[1] = passwordCallback = new PasswordCallback("Password: ", false);
try {
_callbackHandler.handle(callbacks);
} catch ( Exception e ) {
throw new LoginException("Unable to process callbacks");
}
if (nameCallback != null) {
username = nameCallback.getName();
}
if (passwordCallback != null) {
char tmp[] = passwordCallback.getPassword();
if (tmp != null && tmp.length != 0) {
password = new char[tmp.length];
System.arraycopy(tmp, 0, password, 0, tmp.length);
}
}
if (username == null) {
throw new LoginException("Unable to obtain username");
}
//If you will be validating the username and password,
//validate it here
Hashtable customProperties = (Hashtable)_sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new Hashtable();
_sharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY, customProperties);
}
// Default realm is used here, but any trusted realm can be used
String uid = "defaultWIMFileBasedRealm/" + username;
customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uid)
// SECURITYNAME will be the principal name
customproperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
return true;
}
public boolean logout() throws LoginException {
return false;
}
}
- JAAS ログイン構成を作成します。
- 管理コンソールで、「セキュリティー」>「グローバル・セキュリティー」と選択します。
- 「認証」の下で、「Java 認証・承認サービス」>「システム・ログイン」と選択します。
- 「新規」をクリックし、「別名」の下で test.auth.jaxrpcunt と入力します。
- JAAS ログイン・モジュールを追加します。表示されている順序で、以下のログイン・モジュールを追加する必要があります。
test.tokens.MyAuthLoginModule
注: このモジュールの名前は、開発した JAAS ログイン・モジュールと一致しなければなりません。
com.ibm.ws.security.server.lm.ltpaLoginModule
com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule
各ログイン・モジュールで、以下のようにします。
- 「JAAS ログイン・モジュール」の下で「新規」をクリックします。
- 「モジュール・クラス名」の下で、ログイン・モジュールの名前を入力します。
- test.tokens.MyAuthLoginModule の場合のみ、「ログイン・モジュール・プロキシーを使用」を選択します。
- 「OK」をクリックします。
- 「OK」 をクリックしてから、「保存」をクリックします。
- アプリケーション・サーバーを再始動して JAAS 構成の変更を適用します。
- この新しい JAAS 構成を使用するように呼び出し元パートを構成します。
呼び出し元パートの構成は、アプリケーション開発ツールを使用することでのみ行うことができます。 IBM Rational Application Developer インフォメーション・センター
の『コンシューマー・セキュリティー制約での呼び出し元の構成』を参照してください。
- UsernameToken の呼び出し元パートにカスタム・プロパティー com.ibm.wsspi.wssecurity.Caller.assertionLoginConfig=system.test.auth.jaxrpcunt を追加します。
- デプロイメント記述子を保存します。
- アプリケーションをサーバーに再デプロイします。
- サービスをテストします。