3

我正在使用一个库来验证 LDAP 用户,其代码如下:

public void authUser(String username, String pwd)
    throws Exception
  {
    try
    {
      Properties env = getEnvironmentForContext();

      env.put("java.naming.security.principal", "uid=" + 
      username + ",ou=users, dc=company"));
      env.put("java.naming.security.credentials", pwd);
      context = getContext(env);
      System.out.println("Authentication Succeeded");
    }
    catch (Exception e)
    {
      System.out.println("Authentication Failed");
      throw e;
    }
  }

请注意,我无法修改上述验证码。它来自外部库。

但是,我想停用一些用户(而不是删除它们),以便身份验证失败。我正在使用 LDAP(不是 Active Directory)。虽然不知道它是什么 LDAP 软件,但我可以使用“LDAP 浏览器客户端”连接到它。

用户存在于:dc=company、ou=users、uid=username

我可以在 LDAP“用户”上添加/更改什么属性来停用用户。
我可以将用户移动到不同的组,例如:dc=company、ou=deactivatedusers、uid=username?但这不是首选选项,而且我不确定最好的方法。

编辑:正在使用的 LDAP 是:Netscape/Sun/iPlanet

4

4 回答 4

2

根据 Oracle iPlanet (Sun) 文档回答您的问题:

将该属性设置nsAccountLocktrue将禁用用户帐户,并阻止他们绑定到目录。

System.DirectoryServices.Protocols但是,就您已经拥有的代码而言,我只是看不到任何实现此目的的方法...是否有什么阻止您使用.Net中的命名空间为 iPlanet 编写自己的实现?

以下是我针对 iPlanet 服务器绑定和授权用户的方法:

//Build servername from variables
var BuildServerName = new StringBuilder();
BuildServerName.Append(ServerName);
BuildServerName.Append(":" + Convert.ToString(Port));

var ldapConnection = new LdapConnection(BuildServerName.ToString());
//Authenticate the Admin username and password, making sure it's a valid login

try
{
    //Pass in the network (administrative) creds, and the domain.
    var networkCredential = new NetworkCredential(Username, Password, config.LdapAuth.LdapDomain);
    ldapConnection.SessionOptions.SecureSocketLayer = true;
    ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
    ldapConnection.AuthType = AuthType.Anonymous;;
    ldapConnection.Bind(networkCredential);

    //Lets find this person so we can use the correct DN syntax when we authorize them.
    SearchRequest FindThem = new SearchRequest();
    FindThem.Filter = config.LdapAuth.LdapFilter.Replace("{{Patron}}", Patron);
    FindThem.DistinguishedName = config.LdapAuth.LdapDomain;
    FindThem.Scope = System.DirectoryServices.Protocols.SearchScope.Subtree;

    //We'll execute a search using the bound user
    SearchResponse searchresults = (SearchResponse) ldapConnection.SendRequest(FindThem);

    //Should only get on result back, if not throw an error
    if(searchresults.Entries.Count == 1)
    {
         SearchResultEntryCollection entries = searchresults.Entries;
         SearchResultEntry thispatron = entries[0];
         PatronDN = thispatron.DistinguishedName;
    }
 }

如果您想将禁用的用户移动到特定组,从这一点开始,您可以编写逻辑来检查该用户的身份,如果他们包含该组的名称,DistinguishedName则抛出一个已处理的异常。DistinguishedName此外,如果nsAccountLock您的绑定帐户可以使用该属性作为可读属性,您只需检查该属性的值true,并相应地处理用户。

于 2013-04-03T15:09:24.990 回答
2

这是使用 JNDI 在 Active Directory 中禁用和启用用户的 java 代码。在调用以下代码之前,请确保与您的 AD 建立连接。

    public void disableEnableUser() throws Exception {
ModificationItem[] mods = new ModificationItem[1];
            //To enable user
            //int UF_ACCOUNT_ENABLE = 0x0001;
            //mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("userAccountControl",Integer.toString(UF_ACCOUNT_ENABLE)));

        // To disable user
        int UF_ACCOUNT_DISABLE = 0x0002;
        mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("userAccountControl",Integer.toString(UF_ACCOUNT_DISABLE)));

        ctx.modifyAttributes("CN=John ABC,OU=Users,OU=anyone,DC=yourcompanyname,DC=com", mods);
    }

可分辨名称 = "CN=John ABC,OU=Users,OU=anyone,DC=yourcompanyname,DC=com" 此名称取决于您的 Active Directory 结构,您可以从您的支持团队确认。

于 2018-05-21T10:36:00.770 回答
0

您可以更改用户的密码。如果是带有密码策略覆盖的 OpenLDAP,或者另一个支持锁定的 LDAP 服务器,您也可以锁定用户。你真的必须找出答案。

于 2013-04-02T23:49:50.460 回答
0

如果目录软件支持密码策略功能,它可能会提供锁定/停用用户的属性。如果没有,您可以简单地取消密码属性(例如,userpassword)。执行经过身份验证的绑定时,LDAP 服务器应向客户端返回“不适当的身份验证”错误。

于 2013-05-16T15:34:28.537 回答