java - 使用 Java 客户端进行单点登录

标签 java single-sign-on

我正在寻找 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.confjava.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/

相关文章:

java - 将时间戳转换为纳秒

java - JNativeHook 在按键期间注册的按键次数多于所需次数

java - 在锁定对象上调用 wait() 之前调用 notify() 可以吗?

java - 引用条件查询中较早的别名字段

delphi - 在 TEdgeBrowser 中启用单点登录

java - 在自定义 Web 应用程序中生成 LTPAToken 2

java - 有没有一种简单的方法可以使用 Apache Web 服务器运行 Java servlet?

single-sign-on - Argo CD - SSO 登录后无法登录 UI

single-sign-on - SSO waffle 询问用户名和密码

zend-framework - Zend Framework - 跨多个(不同)域的单个 session