【问题标题】:Authenticate an Active Directory user with UnboundID using username使用用户名使用 UnboundID 对 Active Directory 用户进行身份验证
【发布时间】:2015-04-07 10:49:02
【问题描述】:

我正在构建一个需要使用 UnboundID 连接到 Active Directory 的应用程序。使用example,我设法将用户与他们的distinguishedNamepassword 联系起来。

但是我想只使用domainusername 对它们进行身份验证,类似于在Windows 中的操作方式。使用名为JXplorer 的工具浏览广告似乎sAMAccountName 可能是我需要的属性。但是,用 sAMAccountName 替换 distinguishedName 会导致 AcceptSecurityContext 错误。使用示例中显示的"uid=..." 语法也会产生相同的错误。

有没有办法只使用域登录,username/sAMAccountNamepassword。或者我是否需要通过 AD 搜索并找到我希望进行身份验证的用户的 distinguishedName,然后使用他们的 distinguishedNamepassword 绑定连接?

【问题讨论】:

  • 与在简单绑定中需要 DN 的传统 LDAP 不同,AD 允许在简单绑定中直接使用 sAMAccountName(所以不,您不需要搜索 DN)。但是由于各种原因,使用 LDAP 进行身份验证并不理想。 Jespa 之类的东西是正确的做法,因为它完全模仿了 Windows 对客户端进行身份验证的方式。
  • 这是一个有趣的替代方案,如果我们计划使用 AD 来管理用户权限,我可能会研究它。目前这和使用 IE SSO 都不是一个选项,所以它似乎有点矫枉过正。我想知道您是如何设法在简单绑定中使用 sAMAccountName 的。毕竟这是我最初问题的目的。

标签: java active-directory ldap unboundid-ldap-sdk


【解决方案1】:

正如@ioplex 在他的评论中所说,AD 接受使用来自 sAMAccountName 的用户名并附加了域名的绑定。只需使用它而不是绑定上的 DN:

String userId = username + "@" + domain;
SimpleBindRequest adminBindRequest = new SimpleBindRequest(userId, passsword);

最终的 userId 将类似于 'eharris@contoso.local'

【讨论】:

  • 这对我不起作用。据我所知,使用 @ 符号 Microsoft 的 AD 服务器尝试匹配电子邮件地址。这没有错,因为电子邮件地址是 AD 中的唯一标识符,但是当您的电子邮件域与 AD 域不同时,这似乎很尴尬。最后我使用了这种方法String userId = username + "\\" + domain。题外话:我最初的问题原来是由我们的域名和服务器 DNS 地址不同引起的。没有人记得告诉我的事情:(
【解决方案2】:

您将需要使用具有适当权限的帐户来执行对 samAccountName 的搜索以定位用户,然后使用专有名称绑定为找到的用户。

您需要确保只从搜索中返回一个条目。

样品仅供演示!

参数类似于:

"adldap.example.com" "CN=bob,OU=Users,DC=example,DC=com" "connPwd" "OU=Users,DC=example,DC=com" "samAccountName" "findUserValue" "用户密码”

    /**
 * @author jwilleke <br/>
 *         Use For Demonstration Purposes ONLY!
 * @param args
 */
public static void main(String[] args)
{
String connHost = args[0];
String connID = args[1];
String connPwd = args[2];
String searchBase = args[3];
String findUserByAttribute = args[4];
String findUserValue = args[5];
String userPassword = args[6];
int connPort = 389;

// TODO Auto-generated method stub
String actualLDAPServer = null;
RootDSE rootDSE = null;
// If I were doing this for real, I would use a POOL for Connections

SSLUtil sslUtil = new SSLUtil(new TrustAllTrustManager()); // Use For Demonstration Purposes ONLY!
SSLSocketFactory sslSocketFactory = null;
try
{
    sslSocketFactory = sslUtil.createSSLSocketFactory();
}
catch (GeneralSecurityException e1)
{
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
SimpleBindRequest adminBindRequest = new SimpleBindRequest(connID, connPwd);
LDAPConnection adminConnection = new LDAPConnection(sslSocketFactory);
try
{
    adminConnection = new LDAPConnection(connHost, connPort);
    log.debug("Successful LDAP adminConnection to:" + connHost + ":" + connPort);
    adminConnection.bind(adminBindRequest);
    log.debug("Successful Bind as:" + connID);
}
catch (LDAPException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

LDAPConnection userConnection = new LDAPConnection(sslSocketFactory);
try
{
    userConnection = new LDAPConnection(connHost, connPort);
    log.debug("Successful LDAP userConnection to:" + connHost + ":" + connPort);
}
catch (LDAPException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}
// Construct Filter to find user
Filter findUserfilter = null;
findUserfilter = Filter.createEqualityFilter(findUserByAttribute, findUserValue);
// Create Search Request
SearchRequest searchRequest = new SearchRequest(searchBase, SearchScope.SUB, findUserfilter);
searchRequest.setSizeLimit(1); // We will error if we get more than one hit
SearchResult searchResult = null;
try
{
    searchResult = adminConnection.search(searchRequest);
}
catch (LDAPSearchException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}
String userDN = null;
if (searchResult.getEntryCount() > 1)
{
    log.error("We got more than one Entry for:" + searchRequest.getFilter());
}
if (searchResult.getEntryCount() == 0)
{
    log.error("We got No Entries for:" + searchRequest.getFilter());
}
for (SearchResultEntry entry : searchResult.getSearchEntries())
{
    userDN = entry.getDN();
    log.debug("Found an Entry: " + userDN);
}
SimpleBindRequest userBindRequest = new SimpleBindRequest(userDN, userPassword);
if (userBindRequest.getBindDN() == null)
{
    log.warn("We got a null for the userBindRequest UserDN and therefore the bind is anonymous !");
}
if (userBindRequest.getPassword() == null)
{
    log.warn("We got a null for the userBindRequest Password and therefore the bind is anonymous !");
}
try
{
    userConnection.bind(userDN, userPassword);
    log.debug("Successful userConnection Bind as:" + userDN);
}
catch (LDAPException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}
}

-吉姆

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多