Forms authentication não mantem autenticado após login

Hoje aprendi: Forms authentication não mantem autenticado após login

Se você está quebrando a cabeça pra entender o porque seu forms authentication está "deslogando" o usuário logo após o login, pode ser que eu consiga te ajudar.

Um projeto que estive trabalhando nos últimos meses me ofereceu alguns desafios, entre eles, o web forms. Meu primeiro contato com web forms foi em 2004, quando fiz um curso na IBTA de web forms com VB.Net :( rsrs.

O forms authentication permite jogar todo o controle de autenticação de um usuário, para o .Net, facilitando a vida do desenvolvedor. O site msdn diz: "Forms authentication permite você autenticar seus usuários utilizando seu código proprietário e então manter um token de autenticação em um cookie ou em uma URL de pagina. Forms authentication esta presente no ciclo de vida de paginas ASP.NET através da classe FormsAuthenticationModule. Você pode acessar as informações e capacidades de forms authentication através da classe FormsAuthentication." (Ou seja, o que eu disse antes, sem encher linguiça).

Referência: https://msdn.microsoft.com/pt-br/library/7t6b43z4.aspx

O Forms Authentication possui diversas configurações e não vou falar delas, a ideia aqui é explicar o problema e a solução, como se fosse a pergunta e a resposta com a flag verde no stackoverflow (e eu sei que você vai direto na flag verde).


<authentication mode="Forms">
   <forms name="NomeDoMeuFormsAuthentication" loginUrl="logon.aspx" protection="All" path="/" timeout="30" />
</authentication>



Quando nossa aplicação executa em um domínio que pertence apenas a nossa aplicação, não teríamos esse problema, porém, se você tem 2 ou mais aplicações no mesmo domínio, usando forms authentication, sem definir um atributo "name", a qualquer momento, quando você executar um FormsAuthentication.SignOut(), você fatalmente vai matar todas as suas aplicações autenticadas no mesmo domínio. Confuso ? vou criar um exemplo:

domínio: www.mimimi.com.br
aplicação A: www.mimimi.com.br/A (uma pasta "A" no IIS configurado como site dentro do site www.mimimi.com.br)
aplicação B: www.mimimi.com.br/B (uma pasta "B" no IIS configurado como site dentro do site www.mimimi.com.br)

Caso eu acesse a aplicação A, e por algum motivo eu execute qualquer pagina na aplicação B que possui um FormsAuthentication.SignOut(), vou matar a autenticação da aplicação A. Para que isso não ocorra, eu preciso definir um "name" para cada forms authentication de cada aplicação.

Algo como:

Aplicação A:
<authentication mode="Forms">
   <forms name="AppA" loginUrl="logon.aspx" protection="All" path="/" timeout="30" />
</authentication>


Aplicação B:
<authentication mode="Forms">
   <forms name="AppB" loginUrl="logon.aspx" protection="All" path="/" timeout="30" />
</authentication>

Assim, quando aplicação "B" executar um FormsAuthentication.SignOut(), vou apenas matar a autenticação da aplicação "B".


Algo aparentemente simples, mas que quando não estamos pensando nesse como a origem do problema, pode consumir um tempo bem grande em analise e depuração.


Agradeço ao meu amigo Diogo que sofreu por 3 dias seguidos em outro projeto. Quando expliquei pra ele o que estava acontecendo, ele imediatamente disse que imaginava o problema.

É isso, se você chegou até aqui e conseguiu resolver o mesmo problema, fico feliz :)