Single Sign-On with Java Client(使用Java客户端进行单点登录)
问题描述
我正在寻找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.conf
和java.security.auth.login.config
属性,但是仍然弹出要求输入用户名和密码的对话框。
我也尝试使用GSSName
,但GSSManager.createCredential()
还要求输入用户名和密码(可能使用TextCallbackHandler()
)。
我试图与Waffle相处,但没有使其正常工作。大多数示例和解释都是服务器端的(我只找到一个结合了服务器端和客户端的示例,但是我无法将其分开)。
我知道,也有类似的问题(例如this),但我没有输入密码就无法正常工作。
PS:我知道,DialogCallbackHandler
已删除,我仅将其用于测试目的。
推荐答案
好的,经过几次尝试,我找到了解决方案。问题不在于代码,而在于注册表。如this页所述,从Java7开始,您不能本机访问Windows的票证。要更改此设置,您必须设置额外的注册表项。为此,请进入注册表文件夹
HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaKerberosParameters
并添加密钥
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客户端进行单点登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!