UserPrincipals.GetAuthorizationGroups Ocorreu um erro (1301) ao enumerar os grupos. Depois de atualizar para o Controlador de Domínio do Servidor 2012

Pesquisa:

Problema semelhante com solução alternativa, mas não solução real para problema existente

Problema semelhante apontando para atualização do Microsoft End Point como culpado

Os links acima são os mais adequados para o meu problema, eu também tenho visto todas as questões semelhantes listadas pelo Stack Overflow ao criar este post, e apenas as questões acima mencionadas se encaixam no meu problema.

Fundo:

Eu tenho usadoUserPrincipal.GetAuthorizationGroups para permissões de acesso à página específica que executam o IIS 7.5 no Server 2008 R2 em um site de formulários da web C # .NET 4.0 por dois anos e meio. Em 15 de maio de 2013, removemos um controlador de domínio primário que estava executando o Server 2008 (não o r2) e o substituímos por um controlador de domínio do Server 2012. No dia seguinte, começamos a receber a exceção listada abaixo.

Eu uso o contexto principal para autenticação de formulários. O handshake username / pass é bem-sucedido e o cookie de autenticação é definido corretamente, mas a chamada de contexto principal subsequente também chamaUserPrincipal.GetAuthorizationGroups falha intermitentemente. Resolvemos alguns problemas de BPA que apareceram no Controlador de Domínio do Server 2012, mas isso ainda precisa resolver o problema. Eu também institui um cron que é executado em dois servidores separados. Os dois servidores falharão na resolução do SID do grupo em momentos diferentes, embora estejam executando a mesma base de código. (Um ambiente de desenvolvimento e ambiente de desenvolvimento).

O problema resolve-se temporariamente após a reinicialização do servidor web, e também no servidor de desenvolvimento ele resolverá após 12 horas de não funcionamento. O servidor de produção geralmente irá parar de funcionar corretamente até uma reinicialização sem se resolver.

Neste ponto, estou tentando refinar o cron que direciona controladores de domínio específicos na rede, bem como o novo controlador de domínio e usando a consulta LDAP padrão que está falhando no momento de gerar mais tempos de exceção de destino. Até agora, descobrimos em um servidor web que não há padrão para os dias em que ele falha, mas ele se recuperará em aproximadamente 12 horas. Os resultados mais recentes mostram a falha de resolução do SID do Grupo entre as 8h e as 20h e depois recupera, vários dias depois irá falhar às 20h e recuperar às 8h, depois correr bem por mais 12 horas e falhar novamente. Esperamos ver se é apenas um problema específico de comunicação do servidor ou se é o conjunto inteiro de controladores de domínio.

Exceção:

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()

Questão:

Dadas as informações acima, alguém tem alguma idéia do motivo pelo qual o descomissionamento do Windows Server 2008 (não o r2) e a implementação de um novo Server 2012 DC causariaUserPrincipal.GetAuthorizationGroups falhar com o erro de resolução 1301 SID? Idéias sobre a eliminação de possíveis causas também seriam apreciadas.

Aviso Legal:

Este é o meu primeiro post no Stack Overflow, muitas vezes pesquiso aqui, mas não participei de discussões até agora. Perdoe-me se eu deveria ter postado em outro lugar e fique à vontade para apontar passos melhores antes de postar.

ATUALIZAÇÃO 13-JUN-2013:

No dia 12 de junho abordei a possibilidade de itens não descartados causarem o problema. O prazo tem sido muito curto para determinar se o código ajustado corrigiu o problema, mas continuarei atualizando enquanto trabalhamos em direção a uma solução que talvez com alguma sorte alguém aqui possa ajudar.

Código Original

    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<Principal> 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;
    }

Código atualizado

        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<Principal> 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;

    }

questionAnswers(10)

yourAnswerToTheQuestion