使用Java客户端实现单点登录

5

我正在寻找在Java客户端中的单点登录身份验证。

由于我已经使用AD登录到Windows,主要目标是不必再次输入用户名和密码。我希望Java使用我在Windows登录时接收到的票证。以下代码是我找到的最好的实现方式:

LoginContext lc = new LoginContext("com.sun.security.jgss.krb5.initiate", new DialogCallbackHandler());
lc.login();
Subject.doAs(lc.getSubject(), (PrivilegedExceptionAction<Void>) () -> {
            System.out.println("This is privileged");
            return null;
        });

我已经设置了相应的配置文件中的java.security.krb5.confjava.security.auth.login.config属性,但是仍然弹出一个要求输入用户名和密码的对话框。

我也尝试使用GSSName,但是GSSManager.createCredential()也要求输入用户名和密码(可能是使用TextCallbackHandler())。

我尝试使用Waffle,但没有成功。大多数示例和说明都是服务器端的(我只找到了一个将服务器和客户端结合起来的示例,但我无法将其分开)。

我知道有类似的问题(例如这个),但我无法在不输入密码的情况下使其工作。

PS:我知道DialogCallbackHandler已被弃用,我仅用它进行测试目的。


我现在进展了一些;通过从控制台调用kinit,我可以创建一个票据缓存,并且能够在Java中使用所创建的票据。但是我仍然需要输入密码,而且票据缓存只有几个小时的有效期... - Dániel Somogyi
1个回答

5

好的,经过多次尝试,我找到了一个解决方案。问题不在代码中,而在注册表中。如页面所述,自Java 7以来,您无法本地访问Windows票证。要更改此设置,您需要设置一个额外的注册表键。为此,请进入注册表文件夹。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters

添加密钥。
Value Name: AllowTgtSessionKey
Value Type: REG_DWORD
Value: 0x01

为了完全使其工作,您需要一些额外的设置:

Jaas配置文件

在Jaas配置文件中,您需要设置Jaas要使用哪些安全模块。方括号前面的部分命名了您的配置。如果您使用GSS库,则必须将其命名为com.sun.security.jgss.krb5.initiate。当您使用LoginContext时,只需将配置名称作为第一个参数传递即可。我的jaas.conf如下所示:

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
        useTicketCache = true;
 };

Kerberos配置

您还需要为Kerberos模块进行配置。这主要包含了领域地址,但也可以保存其他信息。下面是一个最小的工作示例:

[realms]
    YOUR.REALM.COM = {
        kdc = your.realm.com:88
        default_domain = REALM.COM
    }

注意,这是区分大小写的!

系统属性

最后,您需要设置Java以查找这些文件。您可以通过在启动时提供属性或调用System.setProperty()来完成此操作:

System.setProperty("java.security.krb5.conf", "src/resources/krb5.conf");
System.setProperty("java.security.auth.login.config", "src/resources/jaas.conf");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接