Fórum Web.config - adicionar e remover tag location #381148

12/07/2010

0

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

Responder

Posts

12/07/2010

Fabio Mans

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

Fabio
Responder

Gostei + 0

12/07/2010

Carlos Nogueira

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.
Responder

Gostei + 0

12/07/2010

Fabio Mans

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

Responder

Gostei + 0

12/07/2010

Carlos Nogueira

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?
Responder

Gostei + 0

12/07/2010

Fabio Mans

Qual sua necessidade?
Responder

Gostei + 0

12/07/2010

Carlos Nogueira

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.
Responder

Gostei + 0

12/07/2010

Fabio Mans

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.
Responder

Gostei + 0

13/07/2010

Carlos Nogueira

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!
Responder

Gostei + 0

13/07/2010

Fabio Mans

Seu projeto está no IIS local da sua máquina ou é uma Web Application?
Responder

Gostei + 0

14/07/2010

Carlos Nogueira

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.
Responder

Gostei + 0

22/07/2010

Carlos Nogueira

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!
Responder

Gostei + 0

22/07/2010

Fabio Mans

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
Responder

Gostei + 0

23/07/2010

Carlos Nogueira

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?
Responder

Gostei + 0

23/07/2010

Carlos Nogueira

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?
Responder

Gostei + 0

26/07/2010

Carlos Nogueira

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!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar