Insegura postagem de volta de um controle asp.net em uma página segura, evitando autenticação

Estamos usando a autenticação de formulários padrão do asp.net. Certas páginas exigem que um usuário esteja logado; e pelo menos algumas dessas páginas são entregues por https. Existe um controle de pesquisa no topo de cada página. Quando isso é usado, não nos importamos se a sessão do usuário expirou, mesmo se a página atual exigir login.

No entanto, atualmente, ao realizar a pesquisa, a autenticação de formulários interna vê que a página que está sendo postada requer autenticação e redireciona o usuário para a página de login, com a página anterior, não a página de resultados de pesquisa como o referenciador.

Qual é a melhor maneira de contornar a segurança aqui? Considerei postar em uma página diferente usando a propriedade PostBackUrl, mas se isso não for https, você receberá a mensagem "você está postando dados em uma conexão não segura", da qual os usuários não gostam.

Obrigado por qualquer ajuda.

Edit: obrigado Nick por sua sugestão de usar um GET na página de pesquisa. Já estamos fazendo isso, mas a string de consulta é construída pelo controle de entrada de pesquisa e, em seguida, redireciona. Como podemos construir a string de consulta sem usar um postback? (Obviamente, o JavaScript é uma opção, mas eu esperava encontrar um mecanismo alternativo.)

3

3 Respostas

Para a página de pesquisa, você deseja garantir que a pesquisa esteja acontecendo por meio de uma solicitação GET. (ou seja, como o Google com o "q" na string de consulta) É provável que você esteja fazendo um POST.

Então mude seu

<form method="post" ...>

para

<form method="get" ...>

The biggest mistake most developers make with search pages is parado a post back. HTTP was designed parado queries or searches through the query string (thus the name), and paraget a form parapost paraa query string instead of the body you need parause a "GET" method. This way any search device can use your search page, even the browsers search box.

Second you want paracreate a special location config for you search page. You add this parayour web.config.


    
        
            
        
    

This creates a special override for that one page and everything inside the location tag uses the exact same web.config structure paraoverride the web.config.

You will want pararepeat this for each page you want paraallow all users to.

2
adicionado

Se a página de resultados da pesquisa estiver realizando um postback, o evento pageload será disparado antes que o botão de pesquisa seja clicado.

Portanto, se a página em que estão, requer um login, esse comando de login será executado antes que o botão de pesquisa clique em evento, enviando-os de volta à tela de login.

Existem algumas maneiras em torno disso fazer a busca de um formulário html normal e fazer itperform um GET não é um POST e mencionado por "Nick"

Ou, se a página inteira estiver dentro de um formulário de postagem do .net, você precisará adicionar o evento do botão de pesquisa a uma sobrecarga do carregamento da página para que seja acionado primeiro.

This site has a good article on the page like cycle and its overrides. http://www.15seconds.com/issue/020102.htm

1
adicionado

Como sugerido em outras respostas, a maneira mais correta de fazer isso seria ter o controle de entrada de pesquisa em um formulário separado que tenha um método get e uma ação de searchresults.aspx. No entanto, isso é difícil com o aspx, já que você pode ter apenas um formulário do lado do servidor em uma página.

No final, a solução a que cheguei, que funciona muito bem, era ter um HttpModule que identificasse se o botão "search" tivesse sido clicado (ao verificar se havia um param com seu id) e depois construir uma string de consulta procurando os critérios params e redirecionados para a página de resultados da pesquisa. Isso significa que todos os módulos de autenticação/autorização foram ignorados, pois já chamamos um redirecionamento para a página de resultados de pesquisa (não segura) antes de serem acionados.

É um pouco frágil, mas para nós funciona muito bem.

0
adicionado