레지스트리 상호작용 없이 UsernameToken을 사용하도록 웹 서비스 애플리케이션 개발

WebSphere Application Server 레지스트리에 액세스하지 않고 호출자 파트로 UsernameToken을 인증하려는 경우 UsernameToken 이용자의 인증 방법을 대체하고 대체 JAAS(Java™ Authentication and Authorization Service) 로그인 구성을 사용하도록 호출자를 구성할 수 있습니다.

이 태스크 정보

이 정보는 JAX-RPC(Java API for XML-based RPC) 웹 서비스에만 적용됩니다.

기본적으로 웹 서비스 보안 UsernameToken 이용자, UsernameLoginModule에 사용되는 JAAS 로그인 모듈은 항상 WebSphere 레지스트리에서 토큰 내 포함된 사용자 이름 및 비밀번호의 유효성을 검증합니다. 이때 이 레지스트리 검사를 우회하도록 사용자 정의 특성을 구성할 수 있습니다. 서비스 제공자에 대한 WS-Security 제한조건에 호출자 파트가 추가된 경우 WebSphere 레지스트리에 대해 UsernameToken에 포함된 사용자 이름 및 비밀번호의 유효성도 검증합니다. 이 유효성 검증은 다음 예제에 나온 대로, system.DEFAULT JAAS(Java Authentication and Authorization Service) 구성 스택의 일부인 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 런타임은 이 두 로그인 모듈을 포함하지 않는 호출자 파트에 대한 JAAS 구성의 사용을 지원하지 않습니다. 그러나 이 JAAS 구성 스택에 고유한 사용자 정의 로그인 모듈을 추가할 수 있습니다.

WebSphere Application Server 레지스트리에 액세스하지 않고 호출자 파트로 UsernameToken을 사용하려는 경우 UsernameLoginModule 및 ltpaLoginModule 모듈 모두 레지스트리에 액세스하지 않도록 방지해야 합니다.
참고: UsernameToken이 애플리케이션 개발자에서 마법사를 사용하여 제공자 애플리케이션에 추가된 경우 UsernameToken의 호출자 파트에 자동으로 추가됩니다. UsernameToken의 ID가 실행 스레드에 존재하려는 경우에만 호출자 파트가 필요합니다. 애플리케이션에서 UsernameToken의 ID가 실행 스레드에 없어도 되는 경우 호출자 파트는 필요하지 않으며 이를 제거할 수 있습니다. 호출자 파트는 배치 디스크립터 확장에 구성되며, 애플리케이션 개발자에서만 액세스 가능합니다.

IBM Rational Application Developer Information Center에서 "이용자 보안 제한조건에서 호출자 구성" 주제를 참조하십시오.

프로시저

  1. UsernameLoginModule 모듈이 레지스트리에 액세스하지 못하도록 하려면 com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck 사용자 정의 특성을 UsernameToken 이용자의 JAAS 구성에 추가하십시오. 다음 두 가지 방법 중 하나로 사용자 정의 특성을 추가할 수 있습니다.
    문제점 방지 문제점 방지: wssecurity.UsernameToken JAAS 구성에 대한 업데이트를 수행하면 애플리케이션 서버에서 이 JAAS 구성의 모든 사용자가 레지스트리를 확인하지 않도록 합니다. 이 동작을 원하지 않는 경우 새 JAAS 구성을 작성하거나 방법을 사용하여 UsernameToken 이용자를 업데이트합니다. gotcha

    wssecurity.UsernameToken JAAS 구성에서 com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule 모듈에 사용자 정의 특성을 추가하려면 다음을 수행하십시오.

    1. 보안 > 글로벌 보안을 클릭하십시오.
    2. 인증에서 JAAS(Java Authentication and Authorization Service) > 시스템 로그인을 클릭하십시오.
    3. wssecurity.UsernameToken을 선택하십시오.
    4. com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule을 선택하십시오.
    5. 다음 사용자 정의 특성을 추가하십시오. com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true.
    6. 확인을 클릭하십시오.
    7. 애플리케이션 서버를 다시 시작하여 업데이트된 JAAS 구성을 다시 로드하십시오.

    애플리케이션의 토큰 이용자에 사용자 정의 특성을 추가하려면 다음 단계를 수행하십시오.

    1. 애플리케이션 > 애플리케이션 유형 > WebSphere 엔터프라이즈 애플리케이션 > (providerAppName) > 모듈 관리 > (moduleName) > 웹 서비스: 서버 보안 바인딩을 클릭하십시오.
    2. 요청 이용자(수신자) 바인딩에서 사용자 정의 편집 > 토큰 이용자를 클릭하십시오.
    3. UsernameToken 이용자를 선택하십시오.
    4. JAAS 구성 > 특성 > 새로 작성을 클릭하십시오.
    5. 다음 사용자 정의 특성을 추가하십시오. com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true.
    6. 확인을 클릭하십시오.
    7. 저장을 클릭하십시오.
    8. 애플리케이션을 다시 시작하십시오.
    참고: UsernameToken 이용자의 이름이 'Token_123'처럼 보이고 선택 불가능하면 보안 제한사항을 추가하는 데 사용한 애플리케이션 개발자는 배치 디스크립터에서 토큰 이용자에게 이름을 제공하는 데 실패합니다. 대안으로 다음 두 가지 옵션 중 하나를 수행할 수 있습니다.
    1. 1단계에서 설명한 대로, 보안 JAAS 구성에 특성을 추가합니다.
    2. 프로젝트 개발자를 통해 애플리케이션 프로젝트에 배치 디스크립터 바인딩을 편집합니다.
    IBM Rational Application Developer Information Center에서 "이용자 보안 제한조건에서 보안 토큰 요구사항 구성" 주제를 참조하십시오.
  2. 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;
    	}
    
    }
  3. JAAS 로그인 구성을 작성하십시오.
    1. 관리 콘솔에서 보안 > 글로벌 보안을 선택하십시오.
    2. 인증에서 JAAS(Java Authentication and Authorization Service) > 시스템 로그인을 선택하십시오.
    3. 새로 작성을 클릭하고 별명test.auth.jaxrpcunt를 입력하십시오.
    4. JAAS 로그인 모듈을 추가하십시오. 표시된 순서대로 다음 로그인 모듈을 추가해야 합니다.
      test.tokens.MyAuthLoginModule
      참고: 이 모듈의 이름은 사용자가 개발한 JAAS 로그인 모듈과 일치해야 합니다.
      com.ibm.ws.security.server.lm.ltpaLoginModule
      com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule

      각 로그인 모듈마다:

      1. JAAS 로그인 모듈에서 새로 작성을 클릭하십시오.
      2. 모듈 클래스 이름에서 로그인 모듈 이름을 입력하십시오.
      3. test.tokens.MyAuthLoginModule에서만 로그인 모듈 프록시 사용을 선택하십시오.
      4. 확인을 클릭하십시오.
      5. 확인저장을 차례로 클릭하십시오.
  4. 애플리케이션 서버를 다시 시작하여 JAAS 구성 변경사항을 적용하십시오.
  5. 새 JAAS 구성을 사용하도록 호출자 파트를 구성하십시오. 애플리케이션 개발자만 사용하여 호출자 파트를 구성할 수 있습니다. IBM Rational Application Developer Information Center에서 "이용자 보안 제한조건에서 호출자 구성" 주제를 참조하십시오.
    • UsernameToken에 대한 호출자 파트에 다음 사용자 정의 특성을 추가하십시오. com.ibm.wsspi.wssecurity.Caller.assertionLoginConfig=system.test.auth.jaxrpcunt.
    • 배치 디스크립터를 저장하십시오.
    • 서버에 애플리케이션을 다시 배치하십시오.
  6. 서비스를 테스트하십시오.

주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_usernametokennoreg
파일 이름:twbs_usernametokennoreg.html