Bati minha cabeça contra isso um pouco demais. Como impeço que um usuário navegue nas páginas de um site depois de desconectado usando FormsAuthentication.SignOut? Eu esperava que isso acontecesse:
FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
Mas isso não acontece. Se eu digitar um URL diretamente, ainda posso navegar para a página. Eu não uso a segurança de roll-your-own há algum tempo, então esqueço por que isso não funciona.
asp.net
forms-authentication
Jason
fonte
fonte
Respostas:
Os usuários ainda podem navegar no seu site porque os cookies não são limpos quando você liga
FormsAuthentication.SignOut()
e são autenticados a cada nova solicitação. Na documentação da Microsoft diz que o cookie será limpo, mas não, bug? É exatamente o mesmo comSession.Abandon()
, o cookie ainda está lá.Você deve alterar seu código para isso:
HttpCookie
está noSystem.Web
espaço para nome. Referência do MSDN .fonte
Usando duas das postagens acima de x64igor e Phil Haselden resolveu isso:
1. x64igor deu o exemplo para fazer o Logout:
Primeiro, você precisa limpar o cookie de autenticação e o cookie de sessão , devolvendo os cookies vazios na resposta ao logout.
2. Phil Haselden deu o exemplo acima de como evitar o cache após o logout:
Você precisa invalidar o cache no lado do cliente por meio da resposta .
fonte
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); HttpCookie sessionCookie = new HttpCookie(sessionStateSection.CookieName, "");
. Em geral, o nome do cookie da sessão não é"ASP.NET_SessionId"
.Parece-me que você não tem sua seção de autorização web.config configurada corretamente. Veja abaixo um exemplo.
fonte
A chave aqui é que você diz "Se eu digitar um URL diretamente ...".
Por padrão, sob autenticação de formulários, o navegador armazena em cache as páginas do usuário. Portanto, selecionando um URL diretamente no menu suspenso da caixa de endereços do navegador ou digitando-o, PODE obter a página no cache do navegador e nunca voltar ao servidor para verificar a autenticação / autorização. A solução para isso é evitar o cache do lado do cliente no evento Page_Load de cada página ou no OnLoad () da sua página base:
Você também pode ligar para:
fonte
Eu já lutei com isso antes também.
Aqui está uma analogia para o que parece estar acontecendo ... Um novo visitante, Joe, chega ao site e faz login através da página de login usando o FormsAuthentication. O ASP.NET gera uma nova identidade para Joe e fornece a ele um cookie. Esse cookie é como a chave da casa e, desde que Joe retorne com essa chave, ele poderá abrir a fechadura. Cada visitante recebe uma nova chave e um novo bloqueio para usar.
Quando
FormsAuthentication.SignOut()
é chamado, o sistema diz a Joe para perder a chave. Normalmente, isso funciona, já que Joe não tem mais a chave, ele não pode entrar.No entanto, se Joe sempre volta, e faz ter essa chave perdida, ele é deixar de volta!
Pelo que sei, não há como dizer ao ASP.NET para alterar a fechadura da porta!
A maneira de viver com isso é lembrar o nome de Joe em uma variável Session. Quando ele sai, abandono a sessão para não ter mais o nome dele. Mais tarde, para verificar se ele tem permissão para entrar, simplesmente comparo o Identity.Name com o que a sessão atual possui e, se não corresponderem, ele não é um visitante válido.
Em resumo, para um site, NÃO confie
User.Identity.IsAuthenticated
sem também verificar suas variáveis de sessão!fonte
Depois de muita pesquisa, finalmente funcionou para mim. Espero que ajude.
fonte
Isso funciona para mim
fonte
O código que você postou parece remover corretamente o token de autenticação de formulários, portanto, é possível que as pastas / páginas em questão não estejam realmente protegidas.
Você confirmou que as páginas não podem ser acessadas antes que um login ocorra?
Você pode postar as configurações do web.config e o código de login que você está usando?
fonte
Escrevi uma classe base para todas as minhas páginas e cheguei ao mesmo problema. Eu tinha um código como o seguinte e não funcionou. Ao rastrear, o controle passa da instrução RedirectToLoginPage () para a próxima linha sem ser redirecionada.
Eu descobri que existem duas soluções. Para modificar FormsAuthentication.RedirectToLoginPage (); ser estar
OU para modificar o web.config adicionando
No segundo caso, durante o rastreamento, o controle não alcançou a página solicitada. Ele foi redirecionado imediatamente para o URL de login antes de atingir o ponto de interrupção. Portanto, o método SignOut () não é o problema, é o método de redirecionamento.
Espero que ajude alguém
Saudações
fonte
Eu apenas tentei algumas das sugestões aqui e, enquanto eu era capaz de usar o botão Voltar do navegador, quando clicou em uma seleção de menu, o token [Autorizar] para esse [ActionResult] me enviou de volta à tela de login.
Aqui está o meu código de logout:
Embora a função de retorno no navegador tenha me levado de volta e exibido o menu protegido (ainda estou trabalhando nisso), não pude fazer nada que estivesse protegido no aplicativo.
Espero que isto ajude
fonte
<deny users="?" />
no web.config)Eu tentei a maioria das respostas neste tópico, sem sorte. Terminou com isso:
Encontre-o aqui: http://forums.asp.net/t/1306526.aspx/1
fonte
Esta resposta é tecnicamente idêntica à do Khosro.Pakmanesh. Estou postando para esclarecer como a resposta dele difere de outras respostas neste segmento e, nesse caso, pode ser usada.
Em geral, para limpar uma sessão do usuário, fazer
efetivamente desconectará o usuário. No entanto , se na mesma solicitação você precisar verificar
Request.isAuthenticated
(como pode acontecer em um filtro de autorização, por exemplo), você verá quemesmo _depois que você fez
HttpContext.Session.Abandon()
eFormsAuthentication.SignOut()
.A única coisa que funcionou foi fazer
Isso efetivamente define
Request.isAuthenticated = false
.fonte
Isso começou a acontecer comigo quando eu definir a autenticação> formas> propriedade Path no
Web.config
. A remoção corrigiu o problema e um simplesFormsAuthentication.SignOut();
removeu novamente o cookie.fonte
Pode ser que você esteja efetuando login em um subdomínio (sub1.domínio.com) e tentando sair de outro subdomínio (www.domínio.com).
fonte
Eu apenas tive o mesmo problema, onde o SignOut () aparentemente não conseguiu remover corretamente o ticket. Mas apenas em um caso específico, em que alguma outra lógica causou um redirecionamento. Depois de remover esse segundo redirecionamento (substituí-lo por uma mensagem de erro), o problema desapareceu.
O problema deve ter sido o redirecionamento da página na hora errada, portanto, não acionando a autenticação.
fonte
Estou tendo um problema semelhante agora e acredito que o problema no meu caso e o pôster original se devem ao redirecionamento. Por padrão, um Response.Redirect causa uma exceção que borbulha imediatamente até ser capturada e o redirecionamento é executado imediatamente. Suponho que isso esteja impedindo que a coleção de cookies modificada seja transmitida ao cliente. Se você modificar seu código para usar:
Isso evita a exceção e parece permitir que o cookie seja enviado corretamente de volta ao cliente.
fonte
Apenas tente enviar uma variável de sessão ao pressionar logon. E na página de boas-vindas, verifique primeiro se a sessão está vazia assim no carregamento da página ou no evento Init:
fonte
Para mim, a seguinte abordagem funciona. Acho que, se houver algum erro após a instrução "FormsAuthentication.SignOut ()", o SingOut não funcionará.
fonte
Você está testando / vendo esse comportamento usando o IE? É possível que o IE esteja servindo essas páginas do cache. É notoriamente difícil fazer o IE liberar seu cache e, portanto, em muitas ocasiões, mesmo após o logout, digitar o URL de uma das páginas "seguras" mostraria o conteúdo em cache de antes.
(Vi esse comportamento mesmo quando você faz logon como um usuário diferente, e o IE mostra a barra "Bem-vindo" na parte superior da sua página, com o nome de usuário do usuário antigo. Atualmente, geralmente uma atualização o atualiza, mas se persistir , ainda pode ser um problema de armazenamento em cache.)
fonte
Fazer Session.abandon () e destruir o cookie funciona muito bem. Estou usando o mvc3 e parece que o problema ocorre se você acessar uma página protegida, sair e acessar o histórico do navegador. Não é grande coisa, mas ainda meio chato.
Tentar acessar os links no meu aplicativo da web funciona da maneira certa.
Configurá-lo para não fazer cache do navegador pode ser o caminho a percorrer.
fonte
Para o MVC, isso funciona para mim:
fonte
Eu queria adicionar algumas informações para ajudar a entender o problema. A autenticação de formulários permite armazenar dados do usuário em um cookie ou na string de consulta do URL. O método suportado pelo site pode ser configurado no arquivo web.config.
De acordo com a Microsoft :
Ao mesmo tempo, eles dizem :
Por fim, em relação ao UseDeviceProfile, eles dizem :
Reunindo tudo isso, dependendo do navegador do usuário, a configuração padrão pode resultar em CookiesSupported sendo true , o que significa que o método SignOut não limpa o ticket do cookie. Isso parece contra-intuitivo e não sei por que funciona dessa maneira - eu esperaria que o SignOut realmente desconectasse o usuário em qualquer circunstância.
Uma maneira de fazer o SignOut funcionar por si só é alterar o modo de cookie para "UseCookies" (ou seja, são necessários cookies) no arquivo web.config:
De acordo com meus testes, isso faz com que o SignOut funcione por si só, ao custo do seu site, agora exigindo que os cookies funcionem corretamente.
fonte
Esteja ciente de que o WIF se recusa a informar o navegador para limpar os cookies se a mensagem wsignoutcleanup do STS não corresponder ao URL com o nome do aplicativo do IIS e quero dizer CASE SENSITIVE . O WIF responde com a verificação verde OK, mas não envia o comando para excluir os cookies do navegador.
Portanto, você precisa prestar atenção à distinção entre maiúsculas e minúsculas dos seus URLs.
Por exemplo, o ThinkTecture Identity Server salva os URLs dos RPs visitantes em um cookie, mas torna todos eles em letras minúsculas. O WIF receberá a mensagem wsignoutcleanup em letras minúsculas e a comparará com o nome do aplicativo no IIS. Se não corresponder, ele não excluirá cookies, mas informará OK ao navegador. Portanto, para este Identity Server, eu precisava escrever todas as URLs no web.config e todos os nomes de aplicativos no IIS em letras minúsculas, a fim de evitar esses problemas.
Além disso, não se esqueça de permitir cookies de terceiros no navegador se você tiver aplicativos fora do subdomínio do STS; caso contrário, o navegador não excluirá os cookies, mesmo que o WIF o informe.
fonte