我们有一个小的LAN,每个用户都通过Active Directory服务器登录Windows。我希望能够以相同的方式从Java代码验证用户。我通过以下方式进行此操作:

Hashtable <String, String> env = new Hashtable <>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://192.168.0.1:389");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "user1");
env.put(Context.SECURITY_CREDENTIALS, "pass1"));
env.put(Context.REFERRAL, "ignore");
try {
    new InitialDirContext(env).close();
    return true;
} catch (AuthenticationException ex) {
    return false;
}


其中user1pass1是用户凭证。

在本地管理员通过显式设置每个用户的允许工作站列表来限制访问之前,这种方法一直很好。现在用户仍然可以登录Windows,但是我的代码(在允许的工作站上执行)产生了

javax.naming.AuthenticationException: [LDAP: error code 49 - ...:
    LdapErr: ...,
    comment: AcceptSecurityContext error,
    data 531,
    ...]


其中"data 531" means "not permitted to logon at this workstation"

所以问题是:设置了用户允许的工作站后,我应该如何在LDAP服务器上对用户进行身份验证?我应该以某种方式将当前的工作站传递给LDAP服务器还是什么?

最佳答案

在AD的userWorkstations属性中设置允许的工作站参数。

因此,您可能需要将承载Java代码的服务器名称设置为AD中登录用户的userWorkstations属性。

请参阅以下链接以获取更多详细信息

Can't get connection with AD from Java code

09-29 20:16