2016-04-11 3 views
2

Я вытягиваю свои волосы, пытаясь заставить LDAP-аутентификацию работать с Active Directory.FailedLoginException, возникающее при использовании JAAS LdapLoginModule для аутентификации с помощью ActiveDirectory

Мы только что установили SharePoint Server 2010, и мы подумали, что было бы неплохо также аутентифицировать пользователей в Active Directory, учитывая, что он уже существует для SharePoint. Наша среда - Windows Server 2008 R2 Standard.

У меня есть один пользователь с именем пользователя [email protected]enter image description here

Согласно этому ответу https://serverfault.com/a/130556 мой провайдер URL должен быть ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw (обратите внимание, что вместо того, чтобы использовать имя хоста vm-sps.rdl.com.tw, ​​Я избрано использовать IP-адрес, как у меня не было времени, чтобы настроить запись DNS для указанного сервера)

Просто, чтобы убедиться, что я выполнить команду Dsquery на сервере: enter image description here

Однако, Я просто не могу получить работу по аутентификации. Я пробовал все три типа JAAS конфигурации в соответствии с LdapLoginModule API

Ниже приведены ошибки я сталкиваюсь:

1. Поисково первый режим:

ПРИМЕЧАНИЕ: Я НЕ указан authzIdentity, как Я не имею, что установка на AD

JAAS Config:

AESLogin_AD1 { 
    com.sun.security.auth.module.LdapLoginModule REQUIRED 
    userProvider="ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw" 
    userFilter="(&(uid={USERNAME})(objectClass=User))" 
    useSSL=false 
    debug=true; 
}; 

Результат:

 [LdapLoginModule] search-first mode; SSL disabled 
     [LdapLoginModule] user provider: ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw 
     [LdapLoginModule] searching for entry belonging to user: [email protected] 
     [LdapLoginModule] authentication failed 
     [LdapLoginModule] aborted authentication 
javax.security.auth.login.FailedLoginException: Cannot find user's LDAP entry 

2. Аутентификация первый режим

JAAS Config:

AESLogin_AD2 { 
    com.sun.security.auth.module.LdapLoginModule REQUIRED 
    userProvider="ldap:///CN=Users,DC=rdl,DC=com,DC=tw" 
    authIdentity="{USERNAME}" 
    userFilter="(&(|(samAccountName={USERNAME})(userPrincipalName={USERNAME})(cn={USERNAME}))(objectClass=user))" 
    useSSL=false 
    debug=true; 
}; 

Результат:

 [LdapLoginModule] authentication-first mode; SSL disabled 
     [LdapLoginModule] user provider: ldap:///CN=Users,DC=rdl,DC=com,DC=tw 
     [LdapLoginModule] attempting to authenticate user: [email protected] 
     [LdapLoginModule] authentication failed 
     [LdapLoginModule] aborted authentication 
javax.security.auth.login.FailedLoginException: Cannot bind to LDAP server 

3. Аутентификация только режим

ПРИМЕЧАНИЕ: Я НЕ указано authzIdentity как я не, что установка на AD

JAAS Config:

AESLogin_AD3 { 
    com.sun.security.auth.module.LdapLoginModule REQUIRED 
    userProvider="ldap://192.168.0.81:389" 
    authIdentity="CN={USERNAME},CN=Users,DC=rdl,DC=com,DC=tw" 
    useSSL=false 
    debug=true; 
}; 

Итог:

 [LdapLoginModule] authentication-only mode; SSL disabled 
     [LdapLoginModule] user provider: ldap://192.168.0.81:389 
     [LdapLoginModule] attempting to authenticate user: [email protected] 
     [LdapLoginModule] authentication failed 
     [LdapLoginModule] aborted authentication 
javax.security.auth.login.FailedLoginException: Cannot bind to LDAP server 

Я также попробовал другую конфигурацию, основываясь на некоторых примерах, с которыми я столкнулся в Интернете:

4.Config из другого примера

JAAS Config:

AESLogin_AD4 { 
    com.sun.security.auth.module.LdapLoginModule REQUIRED 
    userProvider="ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw" 
    authIdentity="{USERNAME}" 
    useSSL=false 
    debug=true; 
}; 

Результат:

 [LdapLoginModule] authentication-only mode; SSL disabled 
     [LdapLoginModule] user provider: ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw 
     [LdapLoginModule] attempting to authenticate user: [email protected] 
     [LdapLoginModule] cannot create LdapPrincipal: bad DN 
     [LdapLoginModule] authentication failed 
     [LdapLoginModule] aborted authentication 
javax.security.auth.login.FailedLoginException: Cannot create LdapPrincipal 

Примечание: Моя четвертая проба, кажется, показывает незначительный прогресс, по крайней мере LDAP связывания, кажется, работа, но теперь вопросы, как представляется, являются cannot create LdapPrincipal: bad DN

Я пошел в исходный код для LdapLoginModule и путем сопоставления сообщения отладки, кажется, это было вызвано (начиная с линии 837):

try { 

    ldapPrincipal = new LdapPrincipal(dn); 

} catch (InvalidNameException e) { 
    if (debug) { 
     System.out.println("\t\t[LdapLoginModule] " + 
          "cannot create LdapPrincipal: bad DN"); 
    } 
    throw (LoginException) 
     new FailedLoginException("Cannot create LdapPrincipal") 
      .initCause(e); 
} 

И на основе LdapPrincipal API, InvalidNameException брошено Если нарушение синтаксиса обнаружено, но я не знаю, где нарушение синтаксиса.

Я также не знаю, как отладить это.

Любая помощь будет очень признательна! Благодаря!

+0

'LdapPrincipal' ожидает [отличительное имя] (https: // tools.ietf.org/html/rfc4514), который «[email protected]» не является. В последнем примере, например (при условии, что конкретной учетной записи разрешено связываться с каталогом), попробуйте установить 'authIdentity' в' CN = {USERNAME}, CN = Пользователи, DC = rdl, DC = com, DC = tw' и войдите в систему как «[email protected]»; или оставить 'authIdentity' как есть и войти в систему как' CN = ahsieh @ rdl.com.tw, ​​CN = Пользователи, DC = rdl, DC = com, DC = tw'. – Uux

+0

Спасибо @Uux, к сожалению, оба ваших предложения приводят к 'javax.security.auth.login.FailedLoginException: не удается связать с сервером LDAP. Любые другие мысли о том, что я могу попробовать? Благодарю. – Arthur

+0

Мое плохое, я не заметил, что 'userProvider' уже содержит базовое DN, поэтому его комбинация с моим предложенным значением' authIdentity', очевидно, относится к несуществующей записи ('CN = ahsieh @ rdl.com.tw, ​​CN = Пользователи , DC = RDL, DC = ком, DC = застегивается, CN = Users, DC = RDL, DC = Com, DC = tw'). Еще одна ошибка в моем предположении заключалась в том, что 'ahsieh @ rdl.com.tw', вероятно (я не знаком с схемой Active Directory (ta)), атрибутом' userPrincipalName', а не 'CN'. Я больше не буду размышлять об этом, потому что вы, по-видимому, сами это поняли. – Uux

ответ

2

Я прошел через много статей в сети и, наконец, нашел решение от Q BonitaSoft в & JAAS config for Active Directory LDAP

JAAS Config:

AESLogin_ADx { 
    com.sun.security.auth.module.LdapLoginModule REQUIRED 
    userProvider="ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw" 
    authIdentity="{USERNAME}@rdl.com.tw" 
    userFilter="(&(|(samAccountName={USERNAME})(userPrincipalName={USERNAME})(cn={USERNAME}))(objectClass=user))" 
    useSSL=false 
    debug=true; 
}; 

Результат:

[LdapLoginModule] authentication-first mode; SSL disabled 
[LdapLoginModule] user provider: ldap://192.168.0.81:389/CN=Users,DC=rdl,DC=com,DC=tw 
[LdapLoginModule] attempting to authenticate user: ahsieh 
[LdapLoginModule] searching for entry belonging to user: ahsieh 
[LdapLoginModule] found entry: CN=Arthur Hsieh,CN=Users,DC=rdl,DC=com,DC=tw 
[LdapLoginModule] authentication succeeded 
[LdapLoginModule] added LdapPrincipal "CN=Arthur Hsieh,CN=Users,DC=rdl,DC=com,DC=tw" to Subject 
[LdapLoginModule] added UserPrincipal "ahsieh" to Subject