UserPrincipals.GetAuthorizationGroups Произошла ошибка (1301) при перечислении групп. После обновления до контроллера домена 2012 сервера

Исследование:

Аналогичная проблема с обходным решением, но не реальное решение существующей проблемы

Аналогичная проблема, указывающая на обновление Microsoft End Point как на виновника

Приведенные выше ссылки являются наиболее подходящими для моей проблемы. Я также просмотрел все похожие вопросы, перечисленные в Stack Overflow при создании этого сообщения, и только вышеуказанные вопросы соответствуют моей проблеме.

Фон:

Я используюUserPrincipal.GetAuthorizationGroups для разрешений для доступа к определенной странице с IIS 7.5 на Server 2008 R2 на сайте веб-форм C # .NET 4.0 в течение 2 с половиной лет. 15 мая 2013 года мы удалили основной контроллер домена под управлением Server 2008 (не r2) и заменили его контроллером домена 2012 сервера. На следующий день мы начали получать исключение, указанное ниже.

Я использую основной контекст для проверки подлинности с помощью форм. Рукопожатие имени пользователя / пароля успешно выполнено, и файл cookie аутентификации установлен правильно, но последующий вызов основного контекста, который также вызываетUserPrincipal.GetAuthorizationGroups терпит неудачу с перерывами. Мы'Мы решили несколько проблем BPA, которые появились в контроллере домена Server 2012, но это еще не помогло решить проблему. Я также учредил cron, который работает на двух отдельных серверах. Два сервера не смогут выполнить разрешение SID группы в разное время, хотя они работают с одной и той же кодовой базой. (Среда разработки и производственная среда).

Эта проблема временно разрешается после перезагрузки веб-сервера, а также на сервере dev она решается сама по себе после 12 часов простоя. Рабочий сервер обычно перестает функционировать должным образом до перезагрузки без разрешения самого себя.

На данный момент я пытаюсь уточнить cron, нацеленный на определенные контроллеры домена в сети, а также на новый DC и использующий стандартный запрос LDAP, который в настоящее время не дает более целевые времена исключений. Так далеко мыНа одном веб-сервере мы обнаружили, что в дни, когда он выходит из строя, отсутствует шаблон, но он восстановится примерно через 12 часов. Последние результаты показывают сбой разрешения SID группы между 8 и 8 часами вечера, затем он восстанавливается, через несколько дней он выходит из строя в 8 часов вечера, восстанавливается в 8 часов утра, затем работает нормально еще 12 часов и снова выходит из строя. Мы надеемся увидеть, является ли это просто конкретной проблемой связи с сервером, или посмотреть, является ли это полным набором контроллеров домена.

Исключение:

Exception information: 
Exception type: PrincipalOperationException 
Exception message: An error (1301) occurred while enumerating the groups.  
The group's SID could not be resolved.
at System.DirectoryServices.AccountManagement.SidList.TranslateSids(String target, IntPtr[] pSids)
at System.DirectoryServices.AccountManagement.SidList..ctor(SID_AND_ATTR[] sidAndAttr)
at System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase)
at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p)
at System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups()

Вопрос:

Учитывая приведенную выше информацию, кто-нибудь имеет представление, почему вывод из эксплуатации Windows Server 2008 (не r2) и внедрение нового DC 2012 Server может привести кUserPrincipal.GetAuthorizationGroups с ошибкой разрешения 1301 SID? Идеи по устранению возможных причин также приветствуются.

Отказ от ответственности:

Это мой первый пост в Stack Overflow, я часто исследую его, но до сих пор не участвовал в дискуссиях. Простите, если я должен был опубликовать в другом месте и не стесняйтесь указывать лучшие шаги перед публикацией.

ОБНОВЛЕНИЕ 13-ИЮНЯ-2013:

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

Оригинальный код

    public bool isGroupMember(string userName, ArrayList groupList)
    {
        bool valid = false;

            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain_server + ".domain.org:636", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);

            // find the user in the identity store
            UserPrincipal user =
                UserPrincipal.FindByIdentity(
                    ctx,
                    userName);

            // get the groups for the user principal and
            // store the results in a PrincipalSearchResult object
            PrincipalSearchResult groups =
                user.GetAuthorizationGroups();

            // display the names of the groups to which the
            // user belongs
            foreach (Principal group in groups)
            {
                foreach (string groupName in groupList)
                {
                    if (group.ToString() == groupName)
                    {
                        valid = true;
                    }
                }

            }
        return valid;
    }

Обновленный код

        public bool isGroupMember(string userName, ArrayList groupList, string domain_server)
        {
        bool valid = false;

            try
            {

                using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain_server + ".domain.org:636", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer))
                {

                    // find the user in the identity store
                    UserPrincipal user =
                        UserPrincipal.FindByIdentity(
                            ctx,
                            userName);

                    try
                    {
                        // get the groups for the user principal and
                        // store the results in a PrincipalSearchResult object
                        using (PrincipalSearchResult groups = user.GetAuthorizationGroups())
                        {
                            // display the names of the groups to which the
                            // user belongs

                            foreach (Principal group in groups)
                            {
                                foreach (string groupName in groupList)
                                {

                                    if (group.ToString() == groupName)
                                    {
                                        valid = true;
                                    }
                                }

                                group.Dispose();

                            }
                        }//end using-2
                    }
                    catch
                    {
                        log_gen("arbitrary info");
                        return false;
                    }
                }//end using-1
            }
            catch
            {
                log_gen("arbitrary info");
                return false;
            }

        return valid;

    }

Ответы на вопрос(10)

Ваш ответ на вопрос