我们有一个小型 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;
}
其中 user1
和 pass1
是用户凭据。
在本地管理员通过明确为每个用户设置允许的工作站列表来限制访问之前,这种方法一直运行良好。现在用户仍然可以登录 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 属性。
请参阅以下链接了解更多详情
关于java - LDAP/Java 身份验证 : How to specify workstation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12908532/