我正在尝试连接我们的 Windows 客户端应用程序以使用单点登录机制。我正在遵循可以找到的解释here http://www.javaactivedirectory.com/?page_id=196。我已经很难完成第一步,即获取登录用户的票证授予票证。运行我的单元测试(代码见下文)时,我收到以下异常:
javax.security.auth.login.LoginException: Unable to obtain Princpal Name for authentication
at com.sun.security.auth.module.Krb5LoginModule.promptForName(Krb5LoginModule.java:800)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:671)
at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:584)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:784)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:698)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:695)
at javax.security.auth.login.LoginContext.login(LoginContext.java:594)
at org.myapp.test.cases.SSOTest.testSSO(SSOTest.java:28)
当我使用 Java 7 运行测试时会发生这种情况。我认为这意味着票证缓存为空。但是,当我使用 Java 6 运行测试时,登录成功,并且我可以检索完全填充的Subject
对象从LoginContext
。当我读到时here http://info.michael-simons.eu/2012/07/23/java-7-jaas-and-kerberos-single-sign-on-vs-newer-windows-systems/,Java 7 现在完全尊重允许/拒绝导出 TGT 的 Windows 7 策略。所以我设置了allowtgtsessionkey
我的注册表中的值,希望这能解决我的问题。但是,尽管重新登录并重新启动,我仍然无法使用 Java 7 访问我的 TGT。使用 Java 6,它工作得很好。有人能指出我缺少什么吗?
SSOTest.java:
@Test
public void testSSO() {
System.setProperty("java.security.auth.login.config", "D:\\login.conf");
LoginContext lc = null;
try {
lc = new LoginContext("TestLoginContext1");
} catch (LoginException e1) {
e1.printStackTrace();
}
try {
lc.login(); // Exception happens here
} catch (LoginException e) {
e.printStackTrace();
}
Subject signedOnUserSubject = lc.getSubject();
System.out.println(signedOnUserSubject);
}
登录配置文件
TestLoginContext1 {
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true doNotPrompt=true debug=true;
};
krb5.conf
[libdefaults]
default_realm = MY.DOMAIN.COM
[realms]
MY.DOMAIN.COM = {
kdc = domaincontroller.my.domain.com
admin_server = domaincontroller.my.domain.com
default_domain = MY.DOMAIN.COM
}
当涉及到本地管理组中的帐户时,这似乎是 Windows 的限制。我读了以下内容here http://cr.openjdk.java.net/~weijun/special/krb5winguide-2/raw_files/new/kwin:
已知的问题
如果AD帐户也添加到本地管理员组中
客户端 PC,Microsoft 限制此类客户端获取
票证的会话密钥(即使您设置了allowtgtsessionkey
注册表项为 1)。解决方法是:忘记您已登录
在用户中,调用kinit.exe。不依赖于 LSA 凭证缓存。
在最近的修补程序中
([35]http://support.microsoft.com/kb/942219/en-us http://support.microsoft.com/kb/942219/en-us, 应该
包含在 Vista SP1 中),对于正常情况,此限制被解除
服务票。然而,它仍然适用于 TGT。由于Java使用TGT
获取其他服务的票证(标准 Kerberos 进程),
此更新对 Windows 上的 JGSS 编程没有任何好处。
此外,即使Java的实现更改为读取
从LSA缓存中获取服务票据,仍然无法执行
委托,因为在这种情况下总是需要 TGT。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)