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.
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 identidadeNo 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.
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
.
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.