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?

Foi útil?

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") = "";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top