Context.User perdendo funções após ser atribuído em Global.asax.Application_AuthenticateRequest

StackOverflow https://stackoverflow.com/questions/56271

Pergunta

Estou usando a autenticação de formulários em meu aplicativo asp.net (3.5).Também estou usando funções para definir qual usuário pode acessar quais subdiretórios do aplicativo.Assim, as seções pertinentes do meu arquivo web.config são assim:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

Com base no que li, isso deve garantir que os únicos usuários capazes de acessar o diretório Admin serão usuários autenticados e atribuídos à função Admin.

Autenticação do usuário, salvamento do tíquete de autenticação e outros problemas relacionados funcionam bem.Se eu remover as tags do arquivo web.config, tudo funcionará bem.O problema surge quando tento impor que apenas usuários com função Admin possam acessar o diretório Admin.

Com base nisso Artigo da base de conhecimento da MS junto com outras páginas da web que fornecem as mesmas informações, adicionei o seguinte código ao meu arquivo Global.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

No entanto, quando tento fazer login, não consigo acessar a pasta Admin (sou redirecionado para a página de login).

Tentando depurar o problema, se eu passar por uma solicitação, se eu executar Context.User.IsInRole("Admin") na linha marcada Debug#1 acima, ele retornará um falso.Se eu executar a mesma instrução na linha Debug#2, será igual a verdadeiro.Portanto, pelo menos no que diz respeito ao Global.asax, a função está sendo atribuída corretamente.

Após Global.asax, a execução vai direto para a página de Login (já que a falta de função faz com que o carregamento da página na pasta admin seja rejeitado).Porém, quando executo a mesma instrução na primeira linha do Page_Load do login, ele retorna falso.Então, em algum lugar após Application_AuthenticateRequest em Global.asax e o carregamento inicial do WebForm no diretório restrito, as informações da função estão sendo perdidas, causando falha na autenticação (nota:em Page_Load, o tíquete de autenticação adequado ainda está atribuído a Context.User.Id - apenas a função está sendo perdida).

O que estou fazendo de errado e como posso fazer com que funcione corretamente?


Atualizar:Eu entrei no solução abaixo

Foi útil?

Solução

Aqui estava o problema e a solução:

No início do desenvolvimento, fui ao menu Site e cliquei em configuração do Asp.net.Isso resultou na adição da seguinte linha ao web.config:

<system.web>
  <roleManager enabled="true" />
</system.web>

Desse ponto em diante, o aplicativo presumia que eu estava desempenhando funções por meio do gerenciador de site Asp.net, e não por meio de funções FormsAuthentication.Daí as falhas repetidas, apesar do fato de a lógica real de autenticação e funções ter sido configurada corretamente.

Depois que esta linha foi removida do web.config tudo funcionou perfeitamente.

Outras dicas

esta é apenas uma tentativa aleatória, mas você está sendo bloqueado por causa da ordem de autorização do Admin?Talvez você devesse tentar mudar seu negar tudo e todos os seus administradores.

Apenas no caso de estar sendo substituído pela negação.

(Eu tinha exemplos de código aqui, mas eles não estavam aparecendo.

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