Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais
Autenticação em Sites Web
Data:8/1/2008

Translate this page now :





Categories: ASP.NET

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :
Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon

Veja Também


aspnet Poderia jurar que fazer um site web no qual a autenticação fosse mista, ou seja, que aceitasse tanto a autenticação windows como a autenticação forms e a autenticação forms via AD (ActiveDirectoryMembershipProvider) seria algo razoavelmente simples.

Porém a prática sempre se mostra mais complexa do que a teoria, mesmo eu já tendo executado uma tarefa semelhante na época do ASP Clássico

Vejamos, passo-a-passo, os problemas que encontrei :

1) O primeiro nem ao menos foi um problema, pois trata-se de característica da arquitetura do IIS a necessidade de separar a autenticação windows pelo fato de que o IIS trabalha pelo mínimo necessário para a execução, então se windows e anônimo estiverem habilitadas, ele optará pelo anônimo.

security A solução é criar um diretório virtual separado que esteja configurado especificamente com a autenticação windows e negando acesso anônimo. Um simples link na aplicação principal faz com que o usuário caia em uma página deste diretório virtual - forçando a atenticação windows.

A página em questão pode fazer um redirect direto de volta ao site principal.

2) A necessidade de igualar as machineKeys já era conhecida, exatamente este tipo de informação que me dava a certeza de que seria fácil.

3) O primeiro problema era tão óbvio que só a prática trouxe sua percepção : Se o site de autenticação windows estava usando... autenticação windows... então como eu podia esperar que entre entrar e sair dele fosse gerado um cookie de... autenticação forms ?!?!

É o tipo de idiotice que ficamos até com vergonha de contar depois. Resolver é razoavelmente simples : forçar a geração do cookie de autenticação forms antes de fazer o redirect.

   1: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   2:     FormsAuthentication.SetAuthCookie(Request.ServerVariables("LOGON_USER"), False)
   3:     Response.Redirect("endereco de retorno")
   4: End Sub

4) Mais uma vez uma informação conhecida, mas que gerou uma necessidade no mínimo estranha : O nome e o path do cookie de autenticação precisavam ser igualados entre os dois diretórios virtuais.

Fazer isso para o primeiro, moleza. Mas e o que encontrava-se com a autenticação windows ?

O resultado é esse :

   1: <authentication mode="Windows">
   2:   <forms name="meucookie" path="/" />
   3: </authentication>

5) Enfim, o ponto mais inesperado : E os grupos a que o usuário pertence ? Ora, o WindowsTokenRoleProvider deveria resolver isso, não ?

Quebrando a Cabeça

Pois é, mas não resolve não. Primeiramente porque não dá para ter 2 roleProviders ativos simultaneamente, um é o default e pronto, nesse caso tinha que ser o sqlRoleProvider, pois estava usando forms.

Claro que mesmo tendo um default, posso buscar o outro manualmente e fazer uma consulta getRolesForUser, não é ?

Não no WindowsTokenRoleProvider. Ele checa o usuário windows autenticado e se recusa a executar a checagem de grupos se o nome do usuário solicitado não for igual ao do usuário windows logado.

Inicialmente a solução parece óbvia : Cria-se um novo roleProvider que faça a consulta dos grupos a que o usuário pertence no AD e devolva isso como sendo os grupos do usuário.

Mas nada nunca é tão simples quanto parece : Fazendo isso você fica com 2 role providers e o ASP.NET apenas vai consultar automaticamente 1 dos role providers, o que for definido como default. O outro role provider depende apenas de você.

LivroTudo bem, tinha certeza de já ter visto antes como lidar com múltiplos role providers. Bastava fazer uma consulta ao livro Professional ASP.NET 2.0 Membership, Security e Role Management para conferir isso.

Mas na prática nada é tão simples. O livro explica que podemos interceptar no global.asax um evento do role manager (do httpmodule de role management e não do provider) e implementarmos nós mesmos a leitura das roles do usuário.

Além da implementação envolver muitas questões de segurança e não parecer atraente, o exemplo contido no livro fazia a implementação lendo um OU outro role provider, tendo então que possuir um mecanismo para decidir qual seria lido. Lógico ou não, queria ler os dois.

Além disso, programar no global.asax é coisa muito pouco reutilizável. Normalmente os eventos de aplicação do global.asax podem ser programados também em um HTTP Module de forma que possa ser compilado e encaixado em outra aplicação. Só que nesse caso não estavamos falando de um evento de aplicação mas de um evento de outro http module que poderia estar habilitado ou não, fatores que dificultam reutilização.

Então como juntar os grupos lidos de 2 roles providers ?

Mas afinal, como o Role Provider estava armazenando os grupos lidos ?

O GenericPrincipal e o WindowsPrincipal são objetos Principal típicos e já conhecidos, mas o RolePrincipal é um carinha com quem eu nunca tinha precisado lidar.

privacy_covert-surveillance É óbvio que o RoleManager só será executado depois da autenticação, quando já temos um GenericPrincipal no contexto HTTP mas não temos nenhum grupo neste GenericPrincipal porque o RoleManager não executou ainda (Dãããã...).

Então o que o RoleManager faz é gerar um novo Principal - o RolePrincipal - agregando as informações do GenericPrincipal e dos grupos lidos.

Só que tem um probleminha : A classe RolePrincipal foi amarrada com um único RoleProvider. Não existe opção alguma de informarmos manualmente para a RolePrincipal quais são os grupos do usuário. A RolePrincipal nos pede o nome de um - e somente um - provider.

E se criarmos uma subclasse e sobrescrevermos a leitura do provider ? - NotInheritable - beco sem saida, não dá para fazer !

Seguranca Depois de uma noite de sono, me manquei da solução mais que óbvia : Ao invés de continuar utilizando 2 RoleProviders, o sqlRoleProvider e o provider personalizado criado por mim para ler os grupos do AD, deveria fazer com que o provider personalizado herdasse de sqlRoleProvider e então sobrescrever a leitura dos grupos para que os grupos do AD e do SQL fossem devolvidos como um conjunto único

6) O passo final, a autenticação forms via AD, foi o mais simples, bastando utilizar o ActiveDirectoryMembershipProvider

Conclusão : Depois deste trabalho todo, o belo resultado de termos o usuário podendo se autenticar pelo site, pela intranet ou na extranet e o sistema de autorização tal como o siteMap lidar com tudo isso de forma totalmente indiferente a origem do usuário realmente compensou.

Quem achou difícil ou viu isso como ponto fraco no ASP.NET, que vá tentar fazer em PHP.

 

 



Categories: ASP.NET


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 1/31/2017 10:29:00 AM
nome: EAUaTZbwHk
email: derby451@hotmail.com
comentário:
EpQi5u http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/29/2017 7:46:00 AM
nome: aOikUVixaKsIzEC
email: jogcbfn@hotmail.com
comentário:
9QiWth http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/29/2017 7:38:00 AM
nome: xsCVdbfloLqmII
email: derby451@hotmail.com
comentário:
KIwKbh http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/2/2017 12:09:00 AM
nome: fuddbYjbQWGlDWs
email: jfvynms4281rt@hotmail.com
comentário:
jKMaEc http://www.FyLitCl7Pf7ojQdDUOLQOuaxTXbj5iNG.com

data: 12/31/2016 5:08:00 PM
nome: ovDbHcwEfoOCwtG
email: jfvynms4281rt@hotmail.com
comentário:
Z5WHh6 http://www.FyLitCl7Pf7ojQdDUOLQOuaxTXbj5iNG.com

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br