检查Java应用程序中使用Active Directory登录的用户

检查Java应用程序中使用Active Directory登录的用户,java,active-directory,ldap,Java,Active Directory,Ldap,因此,我已经四处寻找了相当多的答案,我正在寻找,特别是在这个网站上,没有任何运气,也没有办法得到我想要的这个应用程序 这是一个java应用程序,我正在尝试与Windows Server 2012 R2中的Active Directory进行交互,这样,如果用户已使用Active Directory登录到其计算机,则不必登录此java应用程序 我听说如果用户使用Active Directory登录,机器上会有某种令牌,我希望我能够检查该令牌,获取登录用户的用户名,并使用该用户名(不考虑密码)将他们

因此,我已经四处寻找了相当多的答案,我正在寻找,特别是在这个网站上,没有任何运气,也没有办法得到我想要的这个应用程序

这是一个java应用程序,我正在尝试与Windows Server 2012 R2中的Active Directory进行交互,这样,如果用户已使用Active Directory登录到其计算机,则不必登录此java应用程序

我听说如果用户使用Active Directory登录,机器上会有某种令牌,我希望我能够检查该令牌,获取登录用户的用户名,并使用该用户名(不考虑密码)将他们登录到java应用程序。我想这样做,而不必对AD服务器进行身份验证

我不确定这是否是针对这个java应用程序管理Active Directory最有效的方法,但考虑到我的情况,这就是我所需要的

欢迎链接,如果以前有人问过这个问题,我很抱歉


编辑:这是假设我唯一可用的信息是Active Directory用户的用户名,它将与java应用程序中的用户名匹配。我也有服务器凭据,但我试图避免以任何形式存储服务器的密码。

找到了答案。使用System.getenv(“USERDNSDOMAIN”)可以user@domain如果用户未使用Active Directory登录,则该值为null,在本例中这就足够了。然后,我们使用JAAS和一个服务器conf文件来获取LoginContext,它从登录用户那里获取主题

希望这对别人有帮助

例如,下面是代码:

//this returns the logged in user if they're authenticated with the ldap server (Active Directory)
public javax.security.auth.Subject getSubject()
{
    String ldapServer = System.getenv("USERDNSDOMAIN");

    if (ldapServer == null)
    {
      Logger.error("No \"USERDNSDOMAIN\" environment variable found");
      return null;
    }

    System.setProperty("java.security.auth.login.config", "jaas.conf");
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "true");
    try
    {
      LoginContext loginCtx = new LoginContext("Server", new TextCallbackHandler());
      loginCtx.login();
      return loginCtx.getSubject();
    }
}
以及jaas.conf文件的内容:

Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
useTicketCache=true;
};

您可以在NTLM模块中使用JAAS。对不起,您能详细说明一下吗?我用JAAS查看了一下NTLM,但我真正能找到的仍然是使用用户名和密码点击AD服务器来验证凭据,这是我试图避免的。我可能在看的时候错过了什么。想法?您好,我知道已经有一段时间了,但是您是否有机会详细说明“然后我们使用JAAS和服务器配置文件来获取登录用户的登录文本”部分?当然!这是一个很长的时间,所以我不能确切地记得这一切是如何工作的,但这是我现在得到的。代码张贴在上面。