Pergunta

Como você resolve o problema de loop de login infinito quando você estiver usando cookieless sessões e não pode mudar o nome de login.aspx a um HttpHandler?

i. Quando um usuário com direitos de administrador atinge o botão de logout eo url retorno a uma página restrita é passado para login.aspx seguida, outro usuário sem direitos de administrador tentar da Login, eles se redirecionado para a página de login.

Eu vim através deste solução mas eu não posso mudar o nome de login. aspx para uma http manipulador, ea função IsAuthenticated não parece trabalho na página aspx com auth cookieless porque as formas de autenticação bilhete parece ser retirados do url quando redirecionado para a página de login.

EDIT:

Como esse aplicativo já está em produção não posso alterar o fluxo de página do login / logout / timeout processo ou mudar o nome da página de login.

Foi útil?

Solução

Verifique se o usuário está autorizado a acessar a página no returnUrl, após o Log In na página login.aspx. Você pode usar este método do UrlAuthorizationModule (ou um nome personalizado se ele funciona melhor para você):

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(

     returnUrl,
     userPrincipal, 
     GET");

Se o usuário não está autorizado, basta redirecionar para uma página que o acesso do usuário pode.

Para obter o usuário Principal:

var roles = System.Web.Security.Roles.GetRolesForUser(username);

var principal = new System.Security.Principal.GenericPrincipal(

   new System.Security.Principal.GenericIdentity(username), 

   roles

);

Outras dicas

Nós tivemos um problema semelhante, e eu fixa-lo fazendo o seguinte:

If "LogOut".Equals(e.CommandName) Then
    FormsAuthentication.SignOut()
    Response.Redirect("~/Login.aspx")
End If

E, em seguida, em Login.aspx mudamos o PostBackUrl para Login.aspx se ele contém um parâmetro ReturnUrl que envia a volta usuário para Login.aspx.

A poucas opções ...

One, redirecionar manualmente de volta para Login.aspx quando um usuário estiver conectado para fora, por isso não há ReturnURL. Tenha uma meta-refresh em suas páginas que coincide com o tempo limite da sessão para que o usuário não clique sobre os recursos que eles de repente não pode chegar.

Dois, sempre log alguém no Page_Load de Login.aspx. Ei, por que não? Eu posso pensar de algumas razões, mas talvez eles não se aplicam à sua situação.

Três, ignorar o ReturnURL. Você não tem que chamar RedirectFromLoginPage! Redirecionar o usuário para uma página de destino padrão no login.

Você poderia mudar o fluxo de página?

O que quero dizer é, de volta em vez de redirecionamento para a página login.aspx quando um usuário não tem acesso a um recurso, redirecioná-los para uma página de informações.

Esta página explica as razões para o redirecionamento, e dá-lhes opções como:

1. Click here to login as another user.
2. Click here to request access to the page.
3. Click here to login again, if your session has expired.

Este seria remover a referência circular, e assim o problema.

O que sobre a adição de um http módulo que verifica se o Request.UrlReferrer é a página de login e se assim verifica se eles estão autorizados a acessar o Request.Url e se não redireciona-los para um "Você não está autorizado a visualizar esta página ". página.

Apesar de você dizer que você não pode mudar o nome de login.aspx a um HTTP handler, você já tentou adicionando um redirecionamento HTTP 301 para que sempre que login.aspx é solicitado o servidor redireciona o usuário para um HTTP manipulador por exemplo login.ashx?

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