2012-03-16 2 views
1

Kerberos로 인증 할 수있는 간단한 Active Directory 도구를 빌드하려고합니다.잘못된 사용자 이름/암호로 jaas kerberos 로그인 예외가 발생했습니다.

테스트하는 동안 나는 상당히 성가신 문제에 착륙했습니다! 필드에 유효하지 않은 값을 입력하고 제출 (AD 또는 불량 사용자/암호 조합에 존재하지 않는 사용자)하면 LoginException (Javadoc)이 표시됩니다. 내가이를 잡아서 잘못된 입력으로 인해 로그인이 실패했다고 자동으로 말할 수 있다면 좋을 것입니다.

문제는 Active Directory에 연결하는 데 문제가 있거나 요청 시간 제한이 초과되면 동일한 예외가 발생한다는 것입니다. 트레이스를 인쇄하면 다른 메시지를 볼 수는 있지만 예외 유형은 동일합니다 ...

내가 잘못했거나 다른 것을 잡아 내서 작동시킬 수 있는지 알고 있습니까? 이미 서브 클래스 LoginFailedException을 잡으려고했지만 작동하지 않았으므로 LoginException (Javadoc) 작업으로 직접 이동했습니다.

는 다음 순서대로이 문제에 대한 추적이다 잘못된 사용자 이름/비밀번호

javax.security.auth.login.LoginException: Pre-authentication information was invalid (24) 
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Unknown Source) 
at com.sun.security.auth.module.Krb5LoginModule.login(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at javax.security.auth.login.LoginContext.invoke(Unknown Source) 
at javax.security.auth.login.LoginContext.access$000(Unknown Source) 
at javax.security.auth.login.LoginContext$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.login.LoginContext.invokePriv(Unknown Source) 
at javax.security.auth.login.LoginContext.login(Unknown Source) 
at com.banctecmtl.ca.vlp.tools.ActiveDirectoryValidator.validateUser(ActiveDirectoryValidator.java:80) 
at com.banctecmtl.ca.vlp.controller.UserAccessController.authentify(UserAccessController.java:161) 
at com.banctecmtl.ca.vlp.view.webview.server.UserAccessServiceImpl.authenticate(UserAccessServiceImpl.java:23) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:324) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 
Caused by: KrbException: Pre-authentication information was invalid (24) 
at sun.security.krb5.KrbAsRep.<init>(Unknown Source) 
at sun.security.krb5.KrbAsReq.getReply(Unknown Source) 
at sun.security.krb5.Credentials.sendASRequest(Unknown Source) 
at sun.security.krb5.Credentials.acquireTGT(Unknown Source) 
... 42 more 
Caused by: KrbException: Identifier doesn't match expected value (906) 
at sun.security.krb5.internal.KDCRep.init(Unknown Source) 
at sun.security.krb5.internal.ASRep.init(Unknown Source) 
at sun.security.krb5.internal.ASRep.<init>(Unknown Source) 
... 46 more 

액티브 디렉토리에 연결할 수 (네트워크 카드 비활성화 : P)를

javax.security.auth.login.LoginException: ADNAMEHERE.LAN 
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Unknown Source) 
at com.sun.security.auth.module.Krb5LoginModule.login(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at javax.security.auth.login.LoginContext.invoke(Unknown Source) 
at javax.security.auth.login.LoginContext.access$000(Unknown Source) 
at javax.security.auth.login.LoginContext$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.login.LoginContext.invokePriv(Unknown Source) 
at javax.security.auth.login.LoginContext.login(Unknown Source) 
at com.banctecmtl.ca.vlp.tools.ActiveDirectoryValidator.validateUser(ActiveDirectoryValidator.java:80) 
at com.banctecmtl.ca.vlp.controller.UserAccessController.authentify(UserAccessController.java:161) 
at com.banctecmtl.ca.vlp.view.webview.server.UserAccessServiceImpl.authenticate(UserAccessServiceImpl.java:23) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:324) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 
Caused by: java.net.UnknownHostException: ADNAMEHERE.LAN 
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
at java.net.InetAddress$1.lookupAllHostAddr(Unknown Source) 
at java.net.InetAddress.getAddressFromNameService(Unknown Source) 
at java.net.InetAddress.getAllByName0(Unknown Source) 
at java.net.InetAddress.getAllByName(Unknown Source) 
at java.net.InetAddress.getAllByName(Unknown Source) 
at java.net.InetAddress.getByName(Unknown Source) 
at sun.security.krb5.internal.UDPClient.<init>(Unknown Source) 
at sun.security.krb5.KrbKdcReq$KdcCommunication.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.security.krb5.KrbKdcReq.send(Unknown Source) 
at sun.security.krb5.KrbKdcReq.send(Unknown Source) 
at sun.security.krb5.KrbKdcReq.send(Unknown Source) 
at sun.security.krb5.KrbAsReq.send(Unknown Source) 
at sun.security.krb5.Credentials.sendASRequest(Unknown Source) 
at sun.security.krb5.Credentials.acquireTGT(Unknown Source) 
... 42 more 

고마워요!

답변

1

LoginException.getCause() 덕분에 문제의 원인을 판별 할 수 있습니다. 해당 예외를 사용할 수 있으면 IOException 또는 KrbException 일 수 있습니다.

내가 테스트 케이스로 this good example를 사용하여 다음과 같은 예외 처리 추가 : 그 맥락에서

try { 
    // Oid mechanism = use Kerberos V5 as the security mechanism. 
    krb5Oid = new Oid("1.2.840.113554.1.2.2"); 
    Client client = new Client(); 
    client.login(username, password); 
} 
catch (LoginException e) { 
    e.printStackTrace(); 
    System.err.println("There was an error during the JAAS login"); 
    Throwable t = e.getCause(); 
    if (t instanceof IOException) { 
     System.err.println("Network issue"); 
    } else if (t instanceof KrbException) { 
     System.err.println("Kerberos issue"); 
    } else if (t != null) { 
     System.err.println(t.getClass()); 
    } 
    System.exit(-1); 
} 

KrbExceptionkrb5.conf에 잘못된 Kerberos 클라이언트 구성에서 유효하지 않은 사용자 이름과 암호를 차별하거나 다른 매개 변수 수 없습니다 철자가 틀린 영역처럼.

IOException 덕분에 DNS 이름 또는 IP 주소가 잘못된 경우를 제외하고는 Active Directory 서버를 사용할 수 없다고 확신 할 수 있습니다. 당신의 설정이 정확하고 적어도 하나의 사용자에 대해 작동하는 경우

그래서, 당신은 액티브 디렉토리를 사용할 수 없을 때 IOException LoginException 등의 원인을 얻고, 알 수없는 사용자 이름 또는 잘못된 암호와 같은 모든 인증 문제에 대한 KrbException 것입니다.

그런데 Kerberos 스택 구현 자체가 단지 KrbException을 던지기 때문에 예외 처리가 힘들다고 동의합니다.

첫 번째 옵션으로 기존 코드에 대한 세부 정보가 충분하지 않은 경우 com.sun.security.auth.module.Krb5LoginModule에서 상속 된 고유 한 LoginModule을 만들어 근본 원인에 따라 다른 예외를 발생시켜야합니다. 최신 OpenJDK 소스 코드 Krb5LoginModule을 읽어 보시기 바랍니다.

+0

어떤 종류의 예외가 발생했는지를 알 수있는 유일한 방법은 오류 메시지를 구문 분석하는 것입니다. 이것은 일종의 어리석은 행동입니다. 만약 내가 적어도 할 수 있다면'원인 instanceof KrbException' – David

+0

와우 현상금은 사라졌습니다 ... – David

+0

무슨 일이 있었습니까?나 한테 보상을주기 위해 다른 현상금을 시작할 수 있다고 생각해. –

관련 문제