无法检索TGT,尽管allowtgtsessionkey注册表项



我正在尝试将我们的windows客户端应用程序连接到使用单点登录机制。我遵循这里的解释。我已经在第一步工作中遇到了麻烦,即获取已登录用户的Ticket-Granting-Ticket。当运行我的单元测试(代码见下文)时,我得到了以下异常:

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运行测试时,登录成功了,并且我可以从LoginContext检索到一个完全填充的Subject对象。正如我在这里读到的,Java 7现在完全尊重Windows 7允许/拒绝导出tgt的策略。所以我在注册表中设置了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);
    }

login.conf

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的限制。我在这里读到以下内容:

已知问题

如果AD帐号也加入了本地管理员组客户端PC,微软限制这样的客户端获取票据的会话密钥(即使您设置了allowtgtsessionkey解决方法是:忘记你是一个有日志的用户在user中,调用kinit.exe。不依赖于LSA凭据缓存。

在最近的修复程序中[35]http://support.microsoft.com/kb/942219/en-us,应该是(包含在Vista SP1中),对于普通的
则取消此限制。服务票证。然而,它仍然适用于TGT。因为Java使用TGT获取其他服务的票证(标准Kerberos进程),此更新对Windows上的JGSS编程没有任何好处。此外,即使Java的实现更改为read
从LSA缓存中取出服务票据,仍然无法执行委托,因为在这种情况下总是需要TGT。

相关内容

  • 没有找到相关文章

最新更新