Membro do Active Directory Group Verificando em .net 4.5

Eu tenho um aplicativo ASP.Net MVC usando a autenticação do Windows e estou verificando a associação ao grupo para segurança nas ações do controlador.

Por mais simples que pareça, não encontrei outra pergunta que possa resolver o problema que estou tendo.

Primeira tentativa: [autorizar]

O método clássico é simplesmente dar um tapaAuthorize atributo de anotação de dados na ação do controlador e vá para a cidade:

[Authorize(Roles = @"domain\groupName1")]

Sem dados. Eu sou solicitado por credenciais. Geralmente isso significa que algo está errado com a configuração de autenticação do Windows, mas a configuração é bem: (1)HttpContext.User é umWindowsPrincipal objeto, e (2) eu confirmei outro nome de grupo conhecido funciona.

Segunda tentativa: IsInRole ()

O próximo passo dado foi seguir um caminho mais antigo e usarIPrincipal.IsInRole()e, novamente, retornafalse, o outrotrue.

var wp = (WindowsPrincipal)User;

// false
var inGroup1 = wp.IsInRole(@"domain\groupName1");
// true
var inGroup2 = wp.IsInRole(@"domain\groupName2");

Stumped ... então eu acertei meus nerds de sistemas e checamos tudo. Usuário é um membro do grupo? Sim. Nome do grupo está escrito corretamente? Sim. O próximo passo foi pegar o SID.

Terceira tentativa: Pesquisar coleção do grupo de identidade

No meu controlador eu verificar oWindowsIdentity e examine a coleção de grupos para o SID do grupo problemático:

var wi = (WindowsIdentity)wp.Identity;
var group = wi.Groups.SingleOrDefault(g => g.Value == "group1-sidValue");

ogroup variável é oSecurityIdentifier objeto. Porque não é nulo, podemos ter certeza de que este usuário atual é um membro do grupo que tanto o[Authorize()] ouIsInRole() tentativas não confirmam.

Quarta Tentativa: DirectoryServices.AccountManagement

Neste ponto, estou ficando louco e adiciono referência às APIs do AccountManagement. Eu pesquiso o contexto do domínio para oGroupPrincipal pelo nome e pelo SID:

   var pc = new PrincipalContext(ContextType.Domain, "domain");
   var gp1byName = GroupPrincipal.FindByIdentity(pc, "groupName1")
   var gp1bySid = GroupPrincipal.FindByIdentity(pc, IdentityType.Sid, "group1-sidValue");

Ambas as variáveis ​​principais do grupo estão maduras com o mesmo objeto, e eu verifiquei através de uma variável watch que oMembers coleção contém umUserPrincipal objeto com o mesmo SID como o atualWindowsPrincipal emHttpContext.

Questão:

Que diabos eu perdi aqui? Por que as duas metodologias de checagem de função falham quando fica claro e claro, por meio da exploração de objetos, que o usuário é um membro válido desse determinado grupo?

O fato de que um grupo verifica bem e o outro não parece a parte mais estranha neste momento.

questionAnswers(2)

yourAnswerToTheQuestion