I made a small mistake in my query. 'javax.security.auth.kerberos.KerberosPrincipal' was added to server.xml in userClassNames within Realm Attribute and Realm attribute looks like following in server.xml: => <Realm allRolesMode="authOnly" appName="Tomcat" className="org.apache.catalina.realm.JAASRealm" roleClassNames="org.apache.catalina.realm.GenericPrincipal" stripRealmForGss="false" useContextClassLoader="false" userClassNames="org.apache.catalina.realm.GenericPrincipal,javax.security.auth.kerberos.KerberosPrincipal"/>
In 7.0.84 version, there was no requirement to modify userClassNames. We use Microsoft KDC. This is the case of integrated windows authentication. Our JAAS config for tomcat web application (tomcat/temp/<webapp_name>/conf/jaas.conf) looks like following: com.sun.security.jgss.krb5.accept { com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=true isInitiator=false principal="HTTP/ azureadlinuxvm.ispazuread.onmicrosoft....@ispazuread.onmicrosoft.com" useKeyTab=true keyTab="//home//ispqa//sitekey//webapp_http.keytab" storeKey=true debug=false; }; Tomcat { com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=true isInitiator=false useKeyTab=true principal="HTTP/ azureadlinuxvm.ispazuread.onmicrosoft....@ispazuread.onmicrosoft.com" keyTab="//home//ispqa//sitekey//webapp_http.keytab" storeKey=true debug=false; }; Here's the stacktrace which I think has issue: LoginContext.invokePriv(String) line: 679 LoginContext.login() line: 588 JAASRealm.authenticate(String, CallbackHandler) line: 427 JAASRealm.getPrincipal(String) line: 505 JAASRealm(RealmBase).getPrincipal(String, GSSCredential) line: 1374 JAASRealm(RealmBase).authenticate(GSSContext, boolean) line: 581 SpnegoAuthenticator$AuthenticateAction.run() line: 352 SpnegoAuthenticator$AuthenticateAction.run() line: 337 AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method] Subject.doAs(Subject, PrivilegedAction<T>) line: 360 SpnegoAuthenticator.authenticate(Request, HttpServletResponse, LoginConfig) line: 251 SpnegoAuthenticator(AuthenticatorBase).invoke(Request, Response) line: 566 StandardHostValve.invoke(Request, Response) line: 169 ErrorReportValve.invoke(Request, Response) line: 104 StandardEngineValve.invoke(Request, Response) line: 116 CoyoteAdapter.service(Request, Response) line: 445 Http11Processor(AbstractHttp11Processor<S>).process(SocketWrapper<S>) line: 1137 Http11Protocol$Http11ConnectionHandler(AbstractProtocol$AbstractConnectionHandler<S,P>).process(SocketWrapper<S>, SocketStatus) line: 637 JIoEndpoint$SocketProcessor.run() line: 318 ThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: 1149 ThreadPoolExecutor$Worker.run() line: 624 TaskThread$WrappingRunnable.run() line: 61 TaskThread(Thread).run() line: 748 LoginContext.invokePriv() -> this populates the Subject with subject of server Principal "HTTP/ azureadlinuxvm.ispazuread.onmicrosoft....@ispazuread.onmicrosoft.com". Authenticating username belongs to client i.e. infadom...@ispazuread.onmicrosoft.com. Here's the GenericPrincipal that is return by JAASRealm.authenticate(): GenericPrincipal (id=213) gssCredential null loginContext LoginContext (id=218) name "infadom...@ispazuread.onmicrosoft.com" (id=219) password null roles String[0] (id=221) userPrincipal KerberosPrincipal (id=223) fullName "HTTP/ azureadlinuxvm.ispazuread.onmicrosoft....@ispazuread.onmicrosoft.com" (id=225) nameType 1 realm "ISPAZUREAD.ONMICROSOFT.COM" (id=226) I don't think it should populate server's KerberosPrincipal as userPrincipal. Let me know if you need more information. On Wed, Nov 7, 2018 at 2:41 PM Mark Thomas <ma...@apache.org> wrote: > On 05/11/2018 12:24, Vipul Mehta wrote: > > We have upgraded from tomcat version 7.0.84 to 7.0.91. > > Users authenticate with our web app service using Kerberos logged in user > > credential. After upgrade, login started to fail. > > > > It was because of this change due to which the modified method started > > returning null: > > > > > https://github.com/apache/tomcat70/commit/7b7b5932b6618d13042732c77a4e19ea89b432e3#diff-6fec32edbbb606fe1d1888c99d74e665 > > > > > > User principal was KerberosPrincipal and the class was not specified in > > userClassNames in JAAS config of web application for tomcat. So, I added > > 'KerberosPrincipal' class in JAAS configuration. > > > > => > > > "org.apache.catalina.realm.GenericPrincipal,javax.security.auth.kerberos.KerberosPrincipal" > > > > > > Now we are facing new issue. The principal being returned by > > JAASRealm->createPrincipal() is KerberosPrincipal and not > > GenericUserPrincipal which breaks our code. > > > > KerberosPrincipal does not have delegated credential. > > > > > > On debugging i found that, in JAASRealm->authenticate() method, > > loginContext.getSubject() returns server's subject and not client's. So, > > later in createPrincipal() call username is client's username but subject > > belongs to server. Is this an issue ? > > I've spun up the VMs I use for testing this and checked Tomcat 7.0.88 > (the last version before the change above) and 7.0.x. The environment is > configured as per > http://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html and uses > the JNDI Realm. > > Both work as expected with no configuration changes required. > > It isn't clear from the original post how the JAAS Realm has been > configured. At present this looks like a configuration issue which means > the users list is the place to follow this up. You'll need to provide > enough information for the problem to be replicated. > > Mark > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > > -- Regards, Vipul