Web.config - adicionar e remover tag location

12/07/2010

Bom dia!   Tenho uma página de permissões que ela faz uso do web.config para adicionar ou remover as tags "location" em tempo de execução. Testei local na minha máquina remover as tags e parece ter funcionado. O código utilizado se encontra abaixo:           private void ExcluirPermissoesACL(string caminhoFisicoRaiz, Configuration config)
        {
            XmlDocument xmlConfig = new XmlDocument();
            xmlConfig.Load(caminhoFisicoRaiz + @"\web.config");             List<XmlNode> listNod = new List<XmlNode>();
            foreach (XmlNode nod in xmlConfig.ChildNodes[1].ChildNodes)
            {
                if (nod.Name == "location")
                    listNod.Add(nod);
            }             foreach (XmlNode nod in listNod)
                xmlConfig.ChildNodes[1].RemoveChild(nod);             XmlTextWriter writer = new XmlTextWriter(caminhoFisicoRaiz + @"web.config", null);
            writer.Formatting = Formatting.Indented;
            xmlConfig.WriteTo(writer);
            writer.Flush();
            writer.Close();         }   Porém, após executar o método, se eu for no servidor e no local onde está publicado o projeto, as tags permanecem por lá. Dei permissão de leitura e escrita pelo IISno arquivo web.config. O que será que pode estar acontecendo?
Carlos Nogueira

Carlos Nogueira

Curtidas 0

Respostas

Fabio Mans

Fabio Mans

12/07/2010

Olá coloca um bloco de erro (try/catch) para ver se ocorre algum erro.

Fabio
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Ok,   Inseri um bloco try e catch, mas não ocorreu nenhum erro. A página apresenta a mensagem de sucesso que coloquei caso não ocorra problema, faz o que precisa ser feito no banco e no arquivo, após ele apresentar essa mensagem, vou no web.config mas o arquivo de configuração parece que não foi modificado. Exemplo disso é quando vejo data e hora de modificação do arquivo, onde não é apresentado a data de hoje, por exemplo.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Você sabe que alterar o Web.Config em tempo de execução sua aplicação para? Deve ser isso que está ocorrendo.

GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Hummmm, entendo. Não, não conhecia essa informação, já havia lido a respeito de problemas em tempo de execução e tudo mais. E para eu disponibilizar uma página para o usuário conceder permissões para os usuário, você tem alguma sugestão em como posso fazer isso em tempo de execução com a tag location? Ou existe outra maneira de fazer isso em projetos .NET em tempo de execução?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Qual sua necessidade?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Preciso disponibilizar uma página para o usuário (provavelmente um administrador) que irá acessar a área de backoffice do projeto para configurar os acessos dos usuários nas páginas (menu). Esta configuração será feita para os perfis existentes no projeto. Eu utilizo um controle chamado skmMenu para isso, que até o momento está funcionando conforme o que foi programado, isto é, está dinâmico conforme o perfil do usuário. Mas além do menu, por segurança acredito que seja interessante restringir esse mesmo acesso no web.config. Então, além das alterações que ele faz para um determinado perfil acessar determinada página, eu registro isso no web.config. Essa parte de registrar no web.config que estou tendo trabalho, isto é, alterar as tags location dinamicamente, para que o FormsAuthentication faça o resto do trabalho.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Eu não utilizaria o skmmenu, somente se o meu projeto fosse 1.1, veja um exemplo.

Web.sitemap

 <siteMapNode url="~/Default.aspx" title="::: INÍCIO :::"  description="Tela principal">

      <siteMapNode url="" title="SOLICITAÇÕES"  description="Solicitações" roles="Administrador,Selecao,Aprovador" >
        <!--<siteMapNode url="~/Selecao/SolicitacoesTodas.aspx" title="TODAS SOLICITAÇÕES"  description="Todas as solicitações" roles="Administrador,Selecao, Aprovador" />-->
      <siteMapNode url="~/Selecao/ConsultarSolicitacoes.aspx" title="PESQUISAR SOLICITAÇÕES"  description="Pesquisar por solicitações" roles="Administrador, Selecao, Aprovador" />
      <siteMapNode url="~/Selecao/MinhasSolicitacoes.aspx" title="MINHAS SOLICITAÇÕES"  description="Solicitações por recrutador" roles="Administrador, Selecao, Aprovador" />
        <siteMapNode url="~/Selecao/Favoritos.aspx" title="FAVORITOS"  description="Solicitações favoritos" roles="Administrador, Selecao, Aprovador" />
       </siteMapNode>


      <siteMapNode url="~/Solicitacao.aspx" title="NOVA SOLICITAÇÃO"  description="Cadastrar nova solicitação"  roles="Usuario"/>     
      <siteMapNode url="~/ConsultaSolicitacao.aspx" title="SOLICITAÇÕES DO MEU ESTABELECIMENTO"  description="Relação de solicitações realizadas" roles="Usuario" />  

Em negrito o que cada perfil pode acessar.


Eu não guardo o perfil em Session e sim no cook de autenticação.

Fabio
================================================================

Preciso disponibilizar uma página para o usuário (provavelmente um administrador) que irá acessar a área de backoffice do projeto para configurar os acessos dos usuários nas páginas (menu). Esta configuração será feita para os perfis existentes no projeto. Eu utilizo um controle chamado skmMenu para isso, que até o momento está funcionando conforme o que foi programado, isto é, está dinâmico conforme o perfil do usuário. Mas além do menu, por segurança acredito que seja interessante restringir esse mesmo acesso no web.config. Então, além das alterações que ele faz para um determinado perfil acessar determinada página, eu registro isso no web.config. Essa parte de registrar no web.config que estou tendo trabalho, isto é, alterar as tags location dinamicamente, para que o FormsAuthentication faça o resto do trabalho.
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Entendo.   Desta forma, irei trocar o controle e tentarei fazer uso do controle "Menu" que está na aba "Navigation" da Toolbox. Acredito que com a dica que você me passou, deve solucionar meu problema com autenticação de usuário na página.   Apenas por curiosidade, você comentou anteriormente que ao tentar modificar o web.config em tempo de execução no IIS o sistema para. Porém, eu consegui modificar o web.config em tempo de execução rodando no Visual Studio. Você sabe por que disso? Apenas curiosidade!   Obrigado!
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Seu projeto está no IIS local da sua máquina ou é uma Web Application?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

O projeto é uma Wb Application, que ao rodar pelo Visual Studio, consigo alterar o web.config, porém, após publicar o problema o coloca-lo no IIS do servidor da empresa, não tenho o mesmo resultado que tive ao testar pelo Visual Studio.
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,   Eu acrescentei o controle Menu conforme o artigo https://www.devmedia.com.br/post-1651-Criando-Menus-Baseados-no-Perfil-de-Usuario.html, só que ao rodar o projeto, não consegui visualizar os submenus do sitemap. Meu sitemap ficou assim:   <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/pages/backoffice/home.aspx" title="Inicio BackOffice"  description="">
      <siteMapNode url="" title="Cadastro"  description="">
        <siteMapNode url="~/pages/backoffice/usuarios.aspx" title="Usuários" description=""></siteMapNode>
        <siteMapNode url="~/pages/backoffice/perfis.aspx" title="Perfis" description=""></siteMapNode>
        <siteMapNode url="~/pages/backoffice/alterarsenha.aspx" title="Alterar Senha" description=""></siteMapNode>
      </siteMapNode>
      <siteMapNode url="" title="Operações" description="">
        <siteMapNode url="~/pages/backoffice/permissoes.aspx" title="Permissões" description=""></siteMapNode>
      </siteMapNode>
    </siteMapNode>
</siteMap>   Ao executar o projeto, consigo visualizar apenas os menus "Cadastro" e "Operações". Ao passar o mouse por cima, não é apresentado os items desses menus. Em uma pesquisa na internet, achei este link: http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/ba4a3252-9664-457c-9288-c876ca8955f2. Nele fala de um problema com IE8, então eu acrescentei o que ele pediu no CSS mas continuou o mesmo problema.   Então encontrei este link: http://forums.asp.net/p/1552631/3810883.aspx. Acrescentei a tag na minha masterpage, mas também continuou o problema.   Você sabe o que pode estar ocorrendo? Obrigado!
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

O menuestá errado, siga este exemplo.


<!--<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="~/Default.aspx" title="Home" description="Home">
    <siteMapNode url="~/Login.aspx" title="Acessar"  description="Login" />
    <siteMapNode url="~/SolicitacaoTecnologia.aspx" title="Solicitar à Tecnologia"  description="Solicitações à Tecnologia" /> 


    <siteMapNode url="~/AreaAdministrativa/Default.aspx" title="Área Administrativa"  description="" >
      <siteMapNode url="~/AreaAdministrativa/GerenciarAcesso.aspx" title="Gerenciar Acesso"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarGrupoSolucionador.aspx" title="Gerenciar Grupo"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarPerfil.aspx" title="Gerenciar Perfil"  description="Permite gerenciar perfis de acesso dentro do sistema."   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarSla.aspx" title="Gerenciar SLA"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarStatus.aspx" title="Gerenciar Status"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarArvore.aspx" title="Gerenciar Árvore (Tipo)"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/ClassificarSolicitacoes.aspx" title="Classificar Solicitações."  description=""   />
     

    
    </siteMapNode>


  </siteMapNode>

</siteMap>


Fabio
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,   O menu pode funcionar de maneira diferente em browsers diferentes quando está errado? No sitemap que lhe enviei anteriormente, para teste, na Solution Explorer efetuei um clique com o botão direito do mouse e escolhi a opção "Browse with". Selecionei a opção "Firefox", efetuei um clique no botão "Set as Default" e depois um clique no botão "Browse". Ao efetuar um teste, no firefox os submenus aparecerão normalmente. A versão do meu firefox é 2.0.0.20.   Ao realizar a mesma operação citada acima para Internet Explorer, os submenus não aparecem. Antes de lhe enviar o sitemap, decidi conferir para verificar se esqueci de fechar alguma tag ou qualquer coisa semelhante e não havia identificado nenhum problema.   Mesmo assim, para teste, decidi alterar o sitemap e deixei igual ao que está abaixo:   <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/pages/backoffice/home.aspx" title="Inicio BackOffice"  description="">
      <siteMapNode url="" title="Cadastro"  description="">
        <siteMapNode url="~/pages/backoffice/usuarios.aspx" title="Usuários" description=""></siteMapNode>
      </siteMapNode>
    </siteMapNode>
</siteMap>   Ele não funcionou no Internet Explorer (versão 8), mas funcionou no firefox. Onde está o erro neste sitemap?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,   Pelo firefox para efeito de teste, acessei o sistema com um usuário que tem o perfil "Gerente". O meu arquivo web.sitemap está desta maneira:   <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="" title=""  description="">
        <siteMapNode siteMapFile="~/pages/backoffice/backoffice.sitemap" />
    </siteMapNode>
</siteMap>   E o meu arquivo backoffice.sitemap se encontra assim:   <?xml version="1.0" encoding="utf-8"?>
<siteMap>
  <siteMapNode url="~/pages/backoffice/home.aspx" title="Home" description="" roles="*">
    <siteMapNode url="" title="Cadastro" description="" roles="Desenvolvedor,Técnico,Gerente,Administrativo">
      <siteMapNode url="~/pages/backoffice/perfis.aspx" title="Perfis" description="" roles="Gerente" />
      <siteMapNode url="~/pages/backoffice/usuarios.aspx" title="Usuários" description="" roles="Desenvolvedor" />
      <siteMapNode url="~/pages/backoffice/alterarsenha.aspx" title="Alterar Senha" description="" roles="Desenvolvedor,Técnico,Gerente,Administrativo" />
    </siteMapNode>
    <siteMapNode url="" title="Operações" description="" roles="Gerente">
      <siteMapNode url="~/pages/backoffice/permissoes.aspx" title="Permissões" description="" roles="Gerente" />
    </siteMapNode>
  </siteMapNode>
</siteMap>   Abaixo segue o código que utilizo para carregar o controle menu do ASP.NET (pensando que posso ter vários arquivos sitemap, que podem ser escolhidos conforme determinada situação):   // variável para armazenar a URL do nó principal do menu
string URL = String.Empty; // define a URL de acordo com o parâmetro PROFILE
URL = "~/pages/backoffice/home.aspx"; // cria o objeto XmlSiteMapProvider que será utilizado para construir
// o SiteMap dinamicamente.
XmlSiteMapProvider xmlSiteMap = new XmlSiteMapProvider();
System.Collections.Specialized.NameValueCollection MySiteMap = new System.Collections.Specialized.NameValueCollection(1);
MySiteMap.Add("siteMapFile", "Web.sitemap"); // inicializa o novo objeto SiteMapProvider
xmlSiteMap.Initialize("MyProvider", MySiteMap);
xmlSiteMap.BuildSiteMap(); // cria o DataSource para o objeto SiteMap
SiteMapDataSource siteMap = new SiteMapDataSource(); // atribui o nó principal de acordo com o perfil do usuário
siteMap.StartingNodeUrl = URL; // oculta o nó principal (opcional)
siteMap.ShowStartingNode = false; mnBackoffice.DataSource = siteMap;
mnBackoffice.DataBind();   Para o menu "Usuários" (que se encontra em negrito) tenho apenas o perfil "Desenvolvedor". Quando acesso o sistema com um usuário que tem o perfil "Gerente" (fazendo uso de FormsAuthentication), o menu "Usuários" aparece. Neste caso, o controle menu do ASP.NET não deveria ter omitido esse menu por não se encontrar na roles?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,   Em relação ao último post, consegui identificar o problema (a solução ainda estou pesquisando). O problema de autenticar com usuário que possui perfil de "Gerente" e visualizar um menu apenas para usuário com perfil "Desenvolvedor" é que faltou a configuração no web.config para a tag location, como estava fazendo anteriormente. Pelo que entendi, os dois trabalham juntos para exibir ou não os links no menu (configuração no web.config e sitemap).   Consegui obter essas informações pelo site do Israel Aece, através deste link: http://pontonetpt.com/blogs/israelaece/archive/2006/05/29.aspx, após fazer mais algumas pesquisas pelo fórum do MSDN.   Seguindo neste mesmo caminho, significa que terei que voltar a ver o problema no web.config de não ter alterado dinamicamente as tags location quando distribui a aplicação no IIS. Para tentar evitar seguir neste caminho (já que você comentou anteriormente que alterar o web.config em runtime paralisa a aplicação), como você vem trabalhando com essa questão de conceder permissões dinamicamente/programaticamente por meio de uma página usando Roles?   Com isso, tentarei mudar as coisas que fiz aqui no projeto para ficar mais fácil/tranquilo.   Fico no aguardo. Obrigado!
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Já.   Você concede as permissões das roles manualmente nos arquivos web.config e sitemap?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

As roles são gravadas no banco, eu cadastro na tabela Roles. Qual sua necessidade?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Parametrizar/configurar dinamicamente essas roles.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Então faz pelo banco.



Exemplo "administrador,gerente"
Usuário: Pedro - "administrador,gerente"

Faz pelo banco.

GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Então, no banco de dados eu tenho a tabela de usuários, tenho a tabela de perfis (roles) e tenho a tabela que relaciona o usuário com os perfis. Também tenho a tabela de menu e relaciono está última com os perfis, para determinar os menus que podem ser acessados por cada perfil. Isso é a parte de banco que tenho aqui, e já fiz os testes e está funcionando.   Agora estou trabalhando nessa parte de configuração do SiteMap e web.config (a tag location) para trabalhar com autorização de roles para as páginas e menus, de forma que essa configuração seja dinâmica.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

O Site.Map respeita as roles, ele exibe conforme o perfil do usuário sem programar nada.

GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Tive problemas com o SiteMap em relação a isso. Ele só começou a exibir as opções de menu de acordo com a role autenticada, depois que acrescentei o atributo securityTrimmingEnabled como true, e acrescentei a tag location no web.config, conforme o artigo que encontrei o Israel Aece, que lhe passei o link em post anterior. Mesmo acrescentando somente o atributo securityTrimmingEnabled como true, ainda apresentava todos os menus não respeitando as roles que estavam configuradas no SiteMap.   Após fazer um teste e acrescentar mais a tag location no web.config, então o SiteMap começou a respeitar a configuração das roles.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Agora me perdi então. Vamos começar novamente, o que precisa agora?

GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Tudo bem! Bem, a parte de banco você já sabe que eu tenho e está ok.   Eu acrescentei o sitemap, configurei as roles no sitemap e quando executei a aplicação e acessei com um usuário, o controle menu do ASP.NET exibia opções para o usuário que não estavam configurados para role que ele possui (ele não poderia ver tais opções).
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Dentro de <system.web> fecha o site todo primeiro.


<authorization>
            <deny users="?"/>
        </authorization>


O que precisar liberar como imagens ou css você faz o seguinte.


<location path="Images">
        <system.web>
            <authorization>
                <allow users="*"/>
            </authorization>
        </system.web>
    </location>
    <location path="XML">
        <system.web>
            <authorization>
                <allow users="*"/>
            </authorization>
        </system.web>
    </location>
    <location path="JS">
        <system.web>
            <authorization>
                <allow users="*"/>
            </authorization>
        </system.web>
    </location>


Veja se agora não aparece.



GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Ok, acrescentei o que você solicitou dentro do system.web e mais o que está abaixo:     <location path="App_Themes">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
  <location path="master_pages">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
  <location path="pages/backoffice/home.aspx">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>   Ao acessar o sistema, foi exibido todas as opções para o usuário, não respeitando a configuração das roles no sitemap.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Como você fecha uma área onde só o administrador pode acessar?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Desculpe, não entendi sua pergunta. Como assim?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Como você restringe o acesso onde somente adminstradores podem acessar?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,   Quando decidi restringir um determinado menu para um usuário que acesso com perfil de Administrador ou Gerente, fiz isso apenas para uma questão de teste, no meu ambiente de desenvolvimento e de homologação. O teste é para verificar se realmente a opção do menu iria ou não aparecer. Quando for em ambiente de produção, um administrador, gerente, ou seja lá o que for, terá o acesso a opção no menu.   Por favor, gostaria de pedir novamente que me explique o motivo da pergunta, pois eu adianta estou sem entender a razão do questionamento. Está faltando eu configurar mais alguma coisa no projeto quando o usuário se autenticar no sistema, é isso? Ou tenho que tirar alguma configuração que esteja a mais?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

É assim vou te dar um exemplo.


Na minha aplicação eu tenho o administrador, somente este perfil pode acessar a pasta AreaAdministrativa, veja a imagem abaixo. Perceba o Web.Config dentro da pasta, conteúdo abaixo, com isso ninguém acessa esta pasta, somente o administrador.

Snippet<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <authorization>
           <allow roles="Administrador" />         
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>





Veja o menu abaixo, ele só aparece se o perfil do usuário logado for de administrador, caso nao seja somente Default, Login e SolicitaçãoTecnologia.
Snippet<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="~/Default.aspx" title="Home" description="Home">
    <siteMapNode url="~/Login.aspx" title="Acessar"  description="Login" />
    <siteMapNode url="~/SolicitacaoTecnologia.aspx" title="Solicitar à Tecnologia"  description="Solicitações à Tecnologia" />  


    <siteMapNode url="~/AreaAdministrativa/Default.aspx" title="Área Administrativa"  description="" >
      <siteMapNode url="~/AreaAdministrativa/GerenciarAcesso.aspx" title="Gerenciar Acesso"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarGrupoSolucionador.aspx" title="Gerenciar Grupo"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarPerfil.aspx" title="Gerenciar Perfil"  description="Permite gerenciar perfis de acesso dentro do sistema."   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarSla.aspx" title="Gerenciar SLA"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarStatus.aspx" title="Gerenciar Status"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/GerenciarArvore.aspx" title="Gerenciar Árvore (Tipo)"  description=""   />
      <siteMapNode url="~/AreaAdministrativa/ClassificarSolicitacoes.aspx" title="Classificar Solicitações."  description=""   />
      

     
    </siteMapNode>


  </siteMapNode>

</siteMap>

Dúvidas pergunte.

Fabio

GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Tenho duas dúvidas:   1ª - Conforme a configuração feita no web.config da pasta "AreaAdministrativa", você não precisa acrescentar o atributo "roles" no elemento "siteMapNode"?   2ª - Digamos que para sua área administrativa, você tem dois tipos de usuários que podem acessar ela: "Adm_Nivel1" e "Adm_Nivel2". Quem tem perfil "Adm_Nivel1", pode ter acesso na pasta "AreaAdministrativa" as opções "Gerenciar Acesso", "Gerenciar Grupo" e "Gerenciar Perfil" e quem tem perfil "Adm_Nivel2", pode ter acesso a todas as páginas da pasta "AreaAdministrativa". Como você faria esta configuração?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010


Tenho duas dúvidas:   1ª - Conforme a configuração feita no web.config da pasta "AreaAdministrativa", você não precisa acrescentar o atributo "roles" no elemento "siteMapNode"?

Conforme você viu não precisa.

  2ª - Digamos que para sua área administrativa, você tem dois tipos de usuários que podem acessar ela: "Adm_Nivel1" e "Adm_Nivel2". Quem tem perfil "Adm_Nivel1", pode ter acesso na pasta "AreaAdministrativa" as opções "Gerenciar Acesso", "Gerenciar Grupo" e "Gerenciar Perfil" e quem tem perfil "Adm_Nivel2", pode ter acesso a todas as páginas da pasta "AreaAdministrativa". Como você faria esta configuração?

Ou você separa em duas pasta ou verifica no Page_Load das três páginas.

Primeiro

<authorization>
     <allow roles="Adm_Nivel1,Adm_Nivel2"/>
    <deny users="*"/>
</authorization>

Em seguida

Snippet protected void Page_Load(object sender, EventArgs e)
    {
        if(!HttpContext.Current.User.IsInRole("Adm_Nivel1"))
            Response.Redirect("~/AcessoNegado");
    }

fabio


GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Ok, Alterei da forma como você informou, acessei o sistema com um usuário que tem perfil "Gerente" e após logar, não apareceu o menu na página. No arquivo web.config da pasta, deixei dessa maneira:     <system.web>
      <authorization>
        <allow roles="Gerente"/>
        <deny users="*"/>
      </authorization>
    </system.web> No arquivo sitemap que se encontra dentro da pasta, está desta maneira: <?xml version="1.0" encoding="utf-8"?>
<siteMap>
  <siteMapNode url="~/pages/backoffice/home.aspx" title="Home" description="">
    <siteMapNode url="" title="Cadastro" description="">
      <siteMapNode url="~/pages/frontend/perfis.aspx" title="Perfis" description="" />
      <siteMapNode url="~/pages/backoffice/usuarios.aspx" title="Usuários" description="" />
      <siteMapNode url="~/pages/backoffice/alterarsenha.aspx" title="Alterar Senha" description="" />
    </siteMapNode>
    <siteMapNode url="" title="Operações" description="">
      <siteMapNode url="~/pages/backoffice/permissoes.aspx" title="Permissões" description="" />
    </siteMapNode>
  </siteMapNode>
</siteMap> Este arquivo sitemap, ele é chamado pelo arquivo Web.sitemap que fica na raiz do projeto, sabe? Fiz isso porque provavelmente irá existir mais de um tipo de menu no projeto (um para cada área). Isso pode estar gerando algum problema? Quanto a solução que você informou no post anterior para permissões dos perfis, eu entendi. Existe uma maneira de deixar essa configuração dinâmica? Bem, não sei se a pergunta é a mais correta, mas vou tentar explicar. Ainda no mesmo exemplo, o responsável pelo site deseja criar mais um perfil, o "Adm_Nivel11", para conceder permissões para "Gerenciar Acesso", "Gerenciar Grupo", "Gerenciar Arvore" e "Gerenciar SLA". Existe uma maneira de ele ter condições de fazer isso pelo projeto, sem eu ter que alterar o web.config e as páginas citadas acima manualmente?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,   Tem alguma informação a respeito deste chamado?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Conseguiu resolver?
Os papeis dentro dos seu sistema devem estar bem definidos.

Fabio
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

E se quem define os papéis for algum responsável pelo site? E se a criação desses papéis forem dinâmicas, de projeto para projeto? Como trataria isso?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

O responsável deve ter passar primeiro os requisitos para você criar a estrutura do site, e cada projeto realmente tem seus papéis, você já utilizou o Membership? Ele faz igualzinho o Forms Autentication você cria a estrutura e da permissão na pasta por perfil.

Fabio

E se quem define os papéis for algum responsável pelo site? E se a criação desses papéis forem dinâmicas, de projeto para projeto? Como trataria isso?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Fabio,

Você concorda comigo que até mesmo o Membership, eu preciso inserir manualmente quais páginas/pastas o perfil terá acesso?
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Isso, concordo, você que ter definido quais os papéis o sistema deve contemplar.

Fabio,

Você concorda comigo que até mesmo o Membership, eu preciso inserir manualmente quais páginas/pastas o perfil terá acesso?
GOSTEI 0
Carlos Nogueira

Carlos Nogueira

12/07/2010

Então,

E esses papéis não podem sofrer alterações ao longo do tempo conforme o responsável pelo software julgar necessário? Acesso a um novo módulo do sistema, ou restruturação dos papéis dentro do sistema para novos acessos?

Falo isso porque nos projetos que desenvolvo e dou manutenção na empresa onde trabalho, acontece isso. E não sei se ficará claro para um gerente de vendas ou gerente de logistica, entender que ele tem que definir antes claramente quais são os papéis e que essa mudança não é tão dinânica assim, isto é, que ele precisa acionar a equipe de desenvolvimento ou alguém da área de TI da empresa dele para alterar essas configurações no sistema. Por isso a busca por uma solução dinâmica, isto é, desde que ele entenda conceito de quem pode acessar ou não (o que isso hoje é possível eles entenderem), ele tenha uma página na aplicação dele que ele possa administrar isso.

A solução tradicional para isso eu já tenho, acho que todo mundo, rsrs... Verificar quando não for postback na página e pegar o login do usuário e consultar no banco. Justamente este trecho de código na página que gostaria de trocar pela autorização através do ACL, então nem precisaria programar esse tipo de coisa no code-behind. Porém, fazer o ACL dinâmico é o grande problema, por isso de eu ter perguntado sobre adicionar ou remover a tag location. Não acho solução disso na web de jeito nenhum, por isso decidi postar esse assunto para saber como vocês trabalham essa questão de autorização, uma vez onde quem detém esse controle é o responsável pelo software, e não a equipe de desenvolvimento.
GOSTEI 0
Fabio Mans

Fabio Mans

12/07/2010

Carlos veja o que você acha desta solução.

http://www.dnzone.com/go?92&LinkFile=page1.htm

Fabio
GOSTEI 0
Devmedia

Devmedia

12/07/2010

Carlos,
por falta de retorno estamos concluindo o seu chamado. Caso ainda tenha dúvidas sobre o post,por favor, volte a postar aqui mesmo e o consultor lhe atenderá.
GOSTEI 0
POSTAR