2015-05-20 4 views
0

Ну, я использую DirectoryEntry и LdapConnection для сброса пароля в сценарии, где у нас установлен минимальный возраст и политика пароля. Когда кто-то забывает свой пароль, вы хотите, чтобы они могли сбросить свой пароль на то, что не нарушает историю паролей. В качестве альтернативного решения можно было бы использовать «SetPassword» и сбросить пароль на сгенерированное значение, а затем заставить пользователя изменить его при следующем входе в систему. Это невозможно в нашем сценарии. Следовательно, я следовал this blog post в технике и тестировал расширенные элементы управления LDap, чтобы сбросить пароль, выполнив проверку истории паролей. Короче говоря, это просто меняется на тот же пароль снова и снова без жалоб. Мой код выглядит следующим образом:ActiveDirectory: Сброс пароля в соответствии с историей паролей

private static void PasswordChanger(DirectoryConnection ldapCon, 
     string distinguishedName, 
     string passwordToSet = null) 
    { 
     // the 'unicodePWD' attribute is used to handle pwd handling requests 
     // modification control for the replace operation 
     var damReplace = new DirectoryAttributeModification 
     { 
      Name = "unicodePwd" 
     }; 

     // value to be send with the request 
     damReplace.Add(Encoding.Unicode.GetBytes(String.Format("\"{0}\"", passwordToSet))); 

     // this is a replace operation 
     damReplace.Operation = DirectoryAttributeOperation.Replace; 

     // combine modification controls 
     var damList = new DirectoryAttributeModification[] 
     { 
      damReplace 
     }; 

     // init modify request 
     var modifyRequest = new ModifyRequest(distinguishedName, damList); 

     // the actual extended control OID 
     const string ldapServerPolicyHintsOid = "1.2.840.113556.1.4.2239"; 

     // build value utilizing berconverter 
     var value = BerConverter.Encode("{i}", new object[] { 0x1 }); 

     // init exetnded control. The variable name represts the actual extended control name. 
     var LDAP_SERVER_POLICY_HINTS_OID = new DirectoryControl(ldapServerPolicyHintsOid, 
      value, false, true); 

     // add extended control to modify request 
     modifyRequest.Controls.Add(LDAP_SERVER_POLICY_HINTS_OID); 

      /* send the request into the LDAPConnection and receive the response */ 
     var result = ldapCon.SendRequest(modifyRequest); 
    } 

Вызов Password Changer заключен следующим образом,

   using (var domain = Domain.GetDomain(new DirectoryContext(
        DirectoryContextType.DirectoryServer, 
        ActiveDirectoryInstance, 
        request.ServiceAccountName, 
        request.ServiceAccountPassword))) 
       using (var directoryEntry = domain.GetDirectoryEntry()) 
       using (var directorySearcher = new DirectorySearcher(directoryEntry)) 
       using (var conn = new LdapConnection(new LdapDirectoryIdentifier(ActiveDirectoryInstance), 
        new NetworkCredential(request.ServiceAccountName, 
         request.ServiceAccountPassword, 
         ActiveDirectoryInstance), 
         AuthType.Ntlm)) 
       { 
        ... 
        ... 

        PasswordChanger(....) 
        ... 
        ... 
       } 

EDIT:

Это делать со сценарием объяснено здесь

https://support.microsoft.com/en-us/kb/2386717/

RE мой комментарий re "В качестве альтернативного решения i t можно было бы использовать «SetPassword» и сбросить пароль до сгенерированного значения, а затем заставить пользователя изменить его при следующем входе в систему ».

Мы не можем сделать это в нашем сценарии, поскольку у нас есть история паролей и минимальные возрастные ограничения (24 часа). Поэтому я не могу использовать ChangePassword в пользовательском контексте и SetPassword в контексте администратора (так как это не учитывало бы историю паролей).

+0

Я столкнулся с одним и тем же сценарием и хотел бы знать, сможете ли вы восстановить пароль, соблюдая историю паролей, используя вышеуказанный код. Пожалуйста, поделитесь своими результатами. Заранее спасибо! – Pranay

ответ

0

Элемент управления LDAP_SERVER_POLICY_HINTS_OID управляет только ограничениями истории паролей, что означает, что вы предотвращаете повторное использование паролей, которое должно быть не проблемой, если вы генерируете случайные пароли в первую очередь.

Чтобы проверить новые пароли на настройках сложности пароля, вам понадобится доступ к password filters, установленному на контроллерах домена.

В противном случае вам нужно будет использовать SetPassword - он будет выполнять требования к сложности, но не историю паролей.

+0

Спасибо за ответ. См. EDIT. Нам нужно вызвать SetPassword или подобное, выполнив проверку истории паролей. Следовательно, ваш первый пара является правильным, за исключением того факта, что мы не генерируем случайный пароль (минимальный возраст не позволит пользователю изменить его на день). – MSI

+0

Вы можете называть 'SetPassword', не устанавливая« сменить пароль при следующем входе в систему », а затем отслеживать, будет ли пароль изменен или нет. –

+0

Если вы установите пароль с помощью SetPassword, тогда да, пароль будет изменен, но это не то, что мы ищем, см. в моем сообщении :). SetPassword может быть вызван только в контексте администратора, а также обходит все ограничения политики паролей, что наносит ущерб его использованию для функции «Забыли пароль». Вот почему я использовал эту расширенную функцию управления (подсказку политики) для использования «SetPassword», но с расширенным контролем, чтобы он соблюдал политику паролей. – MSI

 Смежные вопросы

  • Нет связанных вопросов^_^