我正在寻找 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;
});
我已经用相应的 conf 文件设置了 java.security.krb5.conf
和 java.security.auth.login.config
属性,但仍然是一个对话框询问用户名和密码弹出。
我也尝试使用 GSSName
,但是 GSSManager.createCredential()
也要求用户名和密码(可能使用 TextCallbackHandler()
).
我试着和Waffle相处,但没有得到它的工作。大多数示例和解释都是服务器端的(我只找到一个结合了服务器端和客户端的示例,但我无法将其拆分)。
我知道,有类似的问题(例如 this),但我没有输入密码就无法正常工作。
PS:我知道,DialogCallbackHandler
已被删除,我仅将其用于测试目的。
最佳答案
好的,经过多次尝试我找到了解决方案。问题不在代码中,而在注册表中。如 this 所述页面,自 Java 7 起,您无法原生访问 Windows 的票证。要更改此设置,您必须设置一个额外的注册表项。为此,进入注册表文件夹
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
并添加 key
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");
关于java - 使用 Java 客户端进行单点登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288761/