Pergunta

Eu tenho um formulário que se senta atrás de autenticação de formulários ASP.NET. Até agora, a implementação segue um típico "fora da caixa" tipo de configuração.

Uma página permite aos usuários postar mensagens. Se o usuário se senta nessa página por um longo tempo para compor a mensagem, ele pode correr após o término da sessão de autenticação. Nesse caso, o post não ficar gravado ... eles estão apenas redirecionado para a página de login.

Que abordagem devo tomar para evitar que o evento frustrante de uma longa mensagem que está sendo perdido?

Obviamente, eu poderia apenas fazer a sessão de autenticação muito longo, mas há outros fatores no sistema que desencorajam essa abordagem. Existe uma maneira que eu poderia fazer uma exceção para esta página particular para que ele nunca vai redirecionar para a Entrada, desde que seu um postback?

Foi útil?

Solução

O meu colega de trabalho veio com uma solução geral para este tipo de problema usando um HttpModule.

Tenha em mente que ele decidiu para lidar com a sua própria autenticação nesta aplicação particular.

Aqui vai:

Ele criou um HttpModule que detectado quando um usuário não estava conectado. Se o usuário não estava conectado tomou o ViewState dessa página, juntamente com todas as variáveis ??de formulário e armazenados-lo em uma coleção. Depois que o usuário é redirecionado para a página de login com as variáveis ??de formulário da página anterior e as informações ViewState codificado em um campo escondido.

Depois que o usuário autentica novamente com sucesso, há uma seleção para o campo oculto. Se esse campo oculto estiver disponível, um formulário HTML é preenchida com variáveis ??do formulário do velho correios e viewstate. Javascript foi então usada auto enviar este formulário para o servidor.

Outras dicas

Veja este questão relacionada, onde as respostas são praticamente temas sobre o mesmo conceito de manter valores em torno após o login:

  • Login POSTS página nome de usuário, senha e variáveis ??post anterior a página de referência. Referindo logs das páginas no usuário e executa a ação.
  • Login página escreve as variáveis ??do formulário e submete o JavaScript para a página de referência após o login bem-sucedido
  • AJAX de login

Se você não se importa se está logado ou não quando eles POST (parece um pouco duvidoso em termos de segurança para mim ...) então enganchando HttpContext.PostAuthenticateRequest em um IHttpModule lhe daria a chance de relogin usando FormsAuthentication.SetAuthCookie. O evento FormsAuthenticationModule.Authenticate poderia ser usado de forma semelhante, fixando uma HttpContext.User:

// Global.asax
void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) {
   // check for postback somehow
   if (Request.Url == "MyPage.aspx" && Request.Form["MySuperSecret"] == "123") {
      e.User = new GenericPrincipal(new GenericIdentity(), new string[] { });
   }
}

Quando o tempo limite da sessão acontece sessão (e informação da página) do usuário se eliminados, o que significaria a eventual postback falharia. Como os outros têm sugerido há alguns arounds trabalho, mas todos eles assumem que você não se preocupam com autenticação e segurança nessa página particular.

Eu recomendaria usar Ajax para enviar de volta em silêncio a cada 10 minutos ou mais para mantê-lo vivo, ou aumentar o tempo limite da sessão como você sugere. Você poderia tentar fazer uma seção específica página na sua configuração web e incluir lá um tempo limite maior.

lidei com isso de uma vez, adicionando o valor de formulário para o banco de dados, identificadas pelo IP remoto em vez de ID do usuário.

( HttpContext.Request.UserHostAddress )

Em seguida, após o login, você pode verificar para ver se o endereço IP do usuário atual tem uma linha no banco de dados e executar a ação necessária.

Michael

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top