Pergunta

Eu tenho um aplicativo asp.net principal, escrito em asp.net 1.1.Em execução abaixo do aplicativo estão vários aplicativos 2.0.Para desconectar completamente um usuário, posso simplesmente sair do aplicativo 1.1 com FormsAuthentication.SignOut ou é mais complicado que isso?

Foi útil?

Solução

O que você está procurando fazer é chamado Single Sign On e Single Sign Off.Existem diferenças com base em como você configurou os aplicativos.Tentarei esclarecer onde essas diferenças entram em jogo.

Para implementar logon único e logoff único, você precisa tornar o nome do cookie, a proteção e os atributos de caminho iguais entre todos os aplicativos.

<authentication mode="Forms">
    <forms name=".cookiename"
           loginUrl="~/Login.aspx" 
           timeout="30" 
           path="/" />
</authentication>

Em seguida, você precisa adicionar as chaves da máquina e elas precisam ser iguais entre todos os seus aplicativos.

<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"
            encryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"
            validation="SHA1" />

Você está usando domínios de segundo ou terceiro nível para os aplicativos?Nesse caso, você precisará fazer um pouco mais adicionando o domínio ao cookie:

protected void Login(string userName, string password)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(30);
    Response.AppendCookie(cookie);
}

Agora, para fazer a assinatura única, chamar FormsAuthentication.SignOut pode não ser suficiente.A próxima melhor coisa é definir a expiração do cookie para uma data anterior.Isto garantirá que o cookie não será usado novamente para autenticação.

protected void Logout(string userName)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(-1);
    Response.AppendCookie(cookie);
}

Estou levando em consideração que você está usando o mesmo banco de dados para todas as aplicações.Se os aplicativos usarem um banco de dados separado para registro e autenticação, precisaremos fazer mais algumas coisas.Apenas me avise se for esse o caso.Caso contrário, isso deve funcionar para você.

Outras dicas

Poderia ser mais fácil se você tivesse um armazenamento de sessão central para todos os seus aplicativos.Você pode então definir a sessão como nula em um só lugar.

Isso funcionou para mim:

No evento Logout, em vez do método FormsAuthentication.GetAuthCookie use a coleção Cookies no objeto Request conforme abaixo:

HttpCookie cookie = Request.Cookies.Get(otherSiteCookieName);
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);

Claro, isso requer que você saiba o nome do cookie do(s) site(s) dos quais deseja que o usuário seja desconectado - o que, no entanto, não será um problema se você estiver usando o mesmo cookie em todos os aplicativos da web.

Eu prefiro usar web.config

<authentication mode="Forms">
    <forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" />
</authentication>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top