Determinar se o usuário pode acessar a página solicitada?
-
20-08-2019 - |
Pergunta
Eu tenho um site do ASP.NET com várias funções, cada uma com acesso a um diretório separado (ou seja, usuários administrativos podem acessar /administrar, os compradores podem acessar /fazer compras etc.), usando uma página de login compartilhada. Se alguém visitar a página de login com o URL de retorno definido para um diretório ao qual não têm acesso (por exemplo, um comprador visita /login.aspx?returnurl=/admin/index.aspx), o usuário pode autenticar com sucesso (as credenciais de login são válido), mas eles acabam de volta na página de login (eles não têm acesso à página que solicitaram).
Como faço para buscar isso, para que eu possa exibir uma mensagem para o usuário?
Solução 2
Acabei fazendo isso no evento Page_load da página de login:
if (User.Identity.IsAuthenticated)
{
LoginErrorDetails.Text = "You are not authorized to view the requested page";
}
O pensamento, se um usuário autenticado acaba na página de login, eles foram enviados como resultado de tentar acessar uma página que não estão autorizados a visualizar, ou eles autenticaram e depois foram para a página de login manualmente (improvável).
Uma ação adicional seria enviar o usuário para a página inicial relevante sempre que eles visitarem a página de login, se já forem autenticados.
Outras dicas
UrlAuthorizationModule.CheckUrlAccessForPrincipal()
é o que você precisa usar para testar o acesso do usuário a um local (página ou pasta) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )
Uma abordagem seria substituir o Onload de seus formulários ASPX e verificar se o usuário autenticado tem acesso ao recurso com base na função. Então você cria um BasePage.cs (no qual você define uma classe de base que herda do System.Web.ui.Page), por exemplo, a partir da qual todas as suas formas (ASPX) herdam, no qual você faz isso:
protected override void OnLoad(EventArgs e)
{
InitializeSitemap();
if (SiteMap.CurrentNode != null)
{
if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode)))
{
// You can redirect here to some form that has a custom message
Response.Redirect("~/Forms/Logout.aspx");
return;
}
}
base.OnLoad(e);
}
Então, na sua classe de urlhelper, você precisa essa função acessível usada acima:
public static bool IsAccesible(SiteMapNode node)
{
bool toRole = false;
foreach (string role in node.Roles)
{
if (role == "*" || HttpContext.Current.User.IsInRole(role))
{
toRole = true;
}
}
return toRole;
}
Aqui é isanonymousouded, caso você se pergunte:
public static bool IsAnonymousAllowed(SiteMapNode node)
{
return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}
Se você tem diretórios diferentes e está usando a autenticação ASP.NET, é muito fácil. Tudo o que você precisa é colocar o arquivo web.config em cada diretório e definir funções que podem acessar arquivos nesse diretório como este:
<authorization>
<allow roles="shoppers"/>
<deny users="?"/>
</authorization>
Você pode obter mais detalhes de isto Artigo sobre MSDN
Você pode definir tudo no principal web.config como este:
<!-- Configuration for the "sub1" subdirectory. -->
<location path="sub1">
<system.web>
<httpHandlers>
<add verb="*" path="sub1" type="Type1"/>
<add verb="*" path="sub1" type="Type2"/>
</httpHandlers>
</system.web>
</location>
<!-- Configuration for the "sub1/sub2" subdirectory. -->
<location path="sub1/sub2">
<system.web>
<httpHandlers>
<add verb="*" path="sub1/sub2" type="Type3"/>
<add verb="*" path="sub1/sub2" type="Type4"/>
</httpHandlers>
</system.web>
</location>
</configuration>
Isto é de isto artigo sobre msdn :)
EDITAR:
Na sua página, o método de carregamento faz isso:
if(!User.IsInRole("shopper"))
{
lblNoAccess.Visible=true;
lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}
Espero que isso ajude você!
Você pode redirecioná -lo na página de índice, dizendo que ele não pode acessar essa página;)
Bem, por que você não pega o diretório na página de login? Se a página de login puder determinar qual diretório o usuário está tentando acessar, talvez eles possam se redirecionar para a página certa com base na função. Se alguém tentar ir para /admin, e a autenticação é bem -sucedida, você pode verificar se ele tem acesso lá. Caso contrário, você pode redirecionar para a página de destino básica, indicando que eles não têm acesso ou redirecioná -los para a página de destino da função.
EDIT: Você provavelmente poderia redirecionar no evento Loggedin do controle.
Uma outra opção é definir uma variável de sessão quando você estiver verificando os direitos e exibindo isso na página de login.
Então você poderia fazer:
if(!User.IsInRole("shopper"))
{
session("denied") = "You don't have access to shop";
response.redirect("/login");
}
Então, na página de login:
if ( session("denied") != "" ) {
message.text = session("denied");
session("denied") = "";
}