Web.config - adicionar e remover tag location
{
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
Respostas
Fabio Mans
12/07/2010
Fabio
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
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.
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Carlos Nogueira
12/07/2010
<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!
Fabio Mans
12/07/2010
<!--<?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
Carlos Nogueira
12/07/2010
<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?
Carlos Nogueira
12/07/2010
<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?
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
https://www.devmedia.com.br/post-11713-Curso-Online-Forms-Authentication-e-Roles-Aula-I-Apresentando-o-objetivo-do-projeto.html
É exatamente como eu trabalho.
Fabio
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Exemplo "administrador,gerente"
Usuário: Pedro - "administrador,gerente"
Faz pelo banco.
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
<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.
Carlos Nogueira
12/07/2010
<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.
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
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
Carlos Nogueira
12/07/2010
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
Carlos Nogueira
12/07/2010
<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?
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
Os papeis dentro dos seu sistema devem estar bem definidos.
Fabio
Carlos Nogueira
12/07/2010
Fabio Mans
12/07/2010
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?
Carlos Nogueira
12/07/2010
Você concorda comigo que até mesmo o Membership, eu preciso inserir manualmente quais páginas/pastas o perfil terá acesso?
Fabio Mans
12/07/2010
Fabio,
Você concorda comigo que até mesmo o Membership, eu preciso inserir manualmente quais páginas/pastas o perfil terá acesso?
Carlos Nogueira
12/07/2010
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.
Fabio Mans
12/07/2010
http://www.dnzone.com/go?92&LinkFile=page1.htm
Fabio
Devmedia
12/07/2010
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á.