Context.User perdendo funções após ser atribuído em Global.asax.Application_AuthenticateRequest
-
09-06-2019 - |
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
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.