Restringindo o Acesso a Usuarios Nao Autorizados
Boa Tarde
Sou iniciante am ASP.NET e estou desenvolvendo meu primeiro projeto e logicamente encontrei varios obastaculos pelo caminho.Cheguei finalmente a parte onde devo restringir o acesso ao meu site.
Ja criei o cadastro de usuarios e a atribuicao de Roles para cada usuario, definindo na pratica o que cada usuario podera acessar.
Criei varios diretorios, supondo que irei restringir toda a pasta para determinados grupos de Roles.
Ex.: Os usuarios do grupo ADM, poderao acessar a pasta Administradores e os usuarios do grupo Financeiro, nao terao acesso a essa pasta.
Ja vi aquele aplicativo WSAT (Web Site Administration Tool ) que permite fazer o que eu quero sem problemas.Entretanto eu prefiro fazer tudo via codigo.
Eu preciso saber qual e a melhor forma de restringir o acesso as pastas, ou entao a um arquivo dentro de uma pasta, via codigo.
Nas minhas pesquisas ainda nao encontrei uma forma de resolver todos os meus problemas, pois meu objetivo final sera o de permitir que o administrador do site defina quem vai acessar o que e isso apenas se utilizando dos recursos do proprio site.
Muito Obrigado
Sidnei Silva.
Curtidas 0
Respostas
[devmedia .net]
17/02/2009
E aí Sidnei tudo bem ?
Cara, é o seguinte...
Existem duas formas simples para restringir acessos a pastas/arquivos de um site..
1° Utilizando Membership Profiles -> justamente a maneira que você fez, utilizando a ferramenta, você que é muito fácil de fazer e resolve perfeitamente se problema.
2° Pelo código, você mesmo fazendas as restrições de acesso toda via código, que dá mais trabalho.
Já que está utilizando o Membership para cadastrar usuários e login, não vejo necessidade de controlar pelo site, e sinceramente, ou você utiliza um ou outro, pois vai por mim, vai virar uma salada o código, uma parte por membership e outra por código, isso não é um boa prática.
Por quê utilizar restrição via código se já tem pelo membership ??
Caso queira utilizar mesmo a restrição pelo código você pode fazer o seguinte :
Primeiro altere meu Web.Config. O modo de autenticação continua o mesmo, Authenticantion mode = Forms, porém não definimos mais uma página padrão para acesso. Podemos criar várias ou mesmo a mesma página anteriormente utilizada.
Nesta página de Login, direcionar o sujeito através da forma abaixo, com Response Redirect:
FormsAuthentication.SetAuthCookie(user.Text, True)
Response.Redirect("sec/index.aspx") Você também precisará desabilitar o Web.Config existente no diretório seguro, ou seja, não precisa mais existir. Entretanto, para cada página que está na área segura, você terá que iniciar com Sub Page_Load(ByVal obj As Object, ByVal e As EventArgs)
If Not Page.IsPostBack Then
If Not Request.IsAuthenticated Then Response.Redirect("../mensagem.aspx") . . . End if End Sub Neste caso você pode personalizar diversas páginas distintas para cada tipo de usuário. No caso estou redirecionando para a página mensagem.aspx, mas poderia ser para qualquer uma outra e não a página do login. Esta solução é bastante útil quando utilizamos vários domínios diferentes sob uma mesma conta no provedor, pois podemos criar páginas de Login também personalizadas para cada Webpage, em cada domínio ou sub-domínio, além de ser mais flexível. A única desvantagem é adicionar o código em cada página. Aguardo seu retorno Abraços Carlos Jr
Response.Redirect("sec/index.aspx") Você também precisará desabilitar o Web.Config existente no diretório seguro, ou seja, não precisa mais existir. Entretanto, para cada página que está na área segura, você terá que iniciar com Sub Page_Load(ByVal obj As Object, ByVal e As EventArgs)
If Not Page.IsPostBack Then
If Not Request.IsAuthenticated Then Response.Redirect("../mensagem.aspx") . . . End if End Sub Neste caso você pode personalizar diversas páginas distintas para cada tipo de usuário. No caso estou redirecionando para a página mensagem.aspx, mas poderia ser para qualquer uma outra e não a página do login. Esta solução é bastante útil quando utilizamos vários domínios diferentes sob uma mesma conta no provedor, pois podemos criar páginas de Login também personalizadas para cada Webpage, em cada domínio ou sub-domínio, além de ser mais flexível. A única desvantagem é adicionar o código em cada página. Aguardo seu retorno Abraços Carlos Jr
GOSTEI 0
Sidnei Silva.
17/02/2009
Bom Dia Carlos
Nos encontramos novamente.
Bem, voce disse que a ferramenta WSAt e melhor de se utilizar e talvez por ser meu primeiro projeto eu talvez nao consiga compartilhar da mesma opiniao que voce.
Quando o sistema estiver no ar, o administrador do site que na verdade sera apenas mais um usuario, ira definir as pastas que cada usuario podera acessar.Na verdade ele nem ira saber que existem pastas,simplesmente opcoes do menu que so podem ser acessadas pelo administrador, serao colocadas no grupo admnistrador, do financeiro pelos usuarios do financeiro e assim por diante.
Logo eu so poderia usar a ferramenta se eu mesmo fosse definir quem vai acessar o que e nao necessariamente, serei eu a fazer isso.Dai a razao por nao utilizar a ferramente do VS 2005.
Se eu estiver errado, por favor me corrija, afinal ainda estou meio perdido.
Outro detalhe que eu esqueci de mencionar e o seguinte.
Dependendo do usuario que for se logar, ele tera direito a acessar determinadas opcoes.
Eu quero que os usuarios do Grupo financeiro sejam redirecionados imediatamente para a pagina do financeiro e usuarios do Grupo operacional, vao imediatamente para a pagina do operacional.
Posso fazer assim?
Quando ele efetuar o Login e clicar no botao para entrar, sera feita a consistencia abaixo:
If Roles.IsUserInRole("Operacional") Then
Response.Redirect("Operacional.aspx")
'End If
If Roles.IsUserInRole("Financeiro") Then
Response.Redirect("Financeiro.aspx")
'End If
A linha abaixo FormsAuthentication... faz o que exatamente? Grava o nome do usuario em um cookie?
Pergunto porque eu nao gostaria de usar cookies nesse meu primeiro projeto.
Simplesmente porque seria mais um item a ter que analisar.Claro que no futuro eu pretendo utiliza-los, pois sao muito uteis.
FormsAuthentication.SetAuthCookie(user.Text, True)
E eu tambem preciso restringir as opcoes do menu, para que cada usuario enxergue apenas as opcoes que lhe sao cabiveis. Obrigado Sidnei
E eu tambem preciso restringir as opcoes do menu, para que cada usuario enxergue apenas as opcoes que lhe sao cabiveis. Obrigado Sidnei
GOSTEI 0
[devmedia .net]
17/02/2009
Opa, blz Sidnei..
Exatamente como falou, terá que redirecionar os usuários dessa maneira,
fazendo isso na master page fará apenas uma vez... caso contrário terá que colocar em todas as páginas...
Se não for para usar a ferramenta do .net, você terá que fazer na mão mesmo..
E como funciona, tentarei explicar :
antes disso eu não indico fazer dois tipos de controle de usuário, um pelo membership e outra parte "na mão", mas vai da necessidade de cada um...
Vamos lá:
Para restringir acesso aos itens de menu, você deverá criar seu menu dinamicamente,
sendo que todas as informações virão da base de dados, o nome do menu, o link e etc.. tem que estar cadastrado em uma tabela...
TABELA DE MENU (AutoRelacionamento - se relaciona com ela mesmo)
id
IdPai
NomeLink
EnderecoLink
1
1
--
2
1
pai 1
3
1
pai 2
4
1
pai3
5
1
pai4
6
2
Filho 1
7
2
filho1
8
3
filho 2
9
3
filho 2
Depois de criada a tabela de menu, terá que criar uma outra tabela contendo informações do usuário e menu que ele tem acesso, nessa tabela você colocará o código do usuário e o código do item de menu que ele terá acesso.
TABELA DE USUARIO X MENU (Relaciona o item de menu com o usuário)
A = Ativo / I = Inativo idUsuario IdMenu Status 1 1 A 2 1 I 3 1 I 4 1 A Quando o usuário logar no sistema você irá montar o menu dinamicamente, buscando as informações nas tabelas, mas somente as que o usuário terá acesso, você terá que fazer um JOIN entre essas tabelas para conseguir essa informação. Parece complicado , mas não é.. QUERY PARA BUSCAR O MENU DE ACORDO COM O USUÁRIO SELECT TABELA_MENU.nomelink, TABELA_MENU.enderecoLink
FROM TABELA_USUARIO_MENU
JOIN TABELA_MENU
ON TABELA_USUARIO_MENU.IDMENU = TABELA_MENU.IDMENU
AND TABELA_USUARIO_MENU.STATUS = 'A'
WHERE
TABELA_USUARIO_MENU.IDUSUARIO = 10 (código do usuário que está logando)
É a maneira que tem pra fazer, e você utilizará a mesma estrutura para dizer se o usuário tem acesso a determinada página ou não , mas pense comigo, se não aparece no menu, ele não terá conhecimento da página, portanto , não precisa restringir o acesso às páginas, sacou !? Caso não queira fazer dessa maneira, terá que fazer com as ferramentos do .net mesmo, pois na mão só existe esse tipo de acesso. Pois terá que ficar criando items de menu, acesso a pastas e etc.. e se o administrador não tem a ferramenta, terá que criar na mão e criar uma parte administrativa para ele fazer esse cadastros. Abraços Carlos Jr
A = Ativo / I = Inativo idUsuario IdMenu Status 1 1 A 2 1 I 3 1 I 4 1 A Quando o usuário logar no sistema você irá montar o menu dinamicamente, buscando as informações nas tabelas, mas somente as que o usuário terá acesso, você terá que fazer um JOIN entre essas tabelas para conseguir essa informação. Parece complicado , mas não é.. QUERY PARA BUSCAR O MENU DE ACORDO COM O USUÁRIO SELECT TABELA_MENU.nomelink, TABELA_MENU.enderecoLink
FROM TABELA_USUARIO_MENU
JOIN TABELA_MENU
ON TABELA_USUARIO_MENU.IDMENU = TABELA_MENU.IDMENU
AND TABELA_USUARIO_MENU.STATUS = 'A'
WHERE
TABELA_USUARIO_MENU.IDUSUARIO = 10 (código do usuário que está logando)
É a maneira que tem pra fazer, e você utilizará a mesma estrutura para dizer se o usuário tem acesso a determinada página ou não , mas pense comigo, se não aparece no menu, ele não terá conhecimento da página, portanto , não precisa restringir o acesso às páginas, sacou !? Caso não queira fazer dessa maneira, terá que fazer com as ferramentos do .net mesmo, pois na mão só existe esse tipo de acesso. Pois terá que ficar criando items de menu, acesso a pastas e etc.. e se o administrador não tem a ferramenta, terá que criar na mão e criar uma parte administrativa para ele fazer esse cadastros. Abraços Carlos Jr
GOSTEI 0
Sidnei Silva.
17/02/2009
Bem, acho que um Menu dinamico eu deixarei para o proximo projeto.
Ja estou atrasado nesse projeto atual e entao acho que vou usar o WSAT para ir mais rapido.
Bem, daqui a pouco voltarei, para falar um pouco mais sobre esse assunto.
Alias tenho que ser rapido, pois acho que o meu suporte terminara na proxima semana.
Um Abraco
Sidnei
GOSTEI 0
[devmedia .net]
17/02/2009
Ok Sidnei, fique à vontade para nos contactar...
Espero sempre poder ajudá-lo, mas esse seu problema realmente é mais complicao de se resolver,
e é necessário essa grande manobra de criação de tabelas e etc...
Aguardo um novo contato seu,
espero tê-lo atendido bem,
caso contrário ficamos abertos à sugestões, críticas e reclamações,
assim poderemos sempre estar melhorando nossos serviços para melhor atendê-lo.
Abraços
PS: Posso fechar seu chamado ?
Carlos Jr
GOSTEI 0
Sidnei Silva.
17/02/2009
Nao, ainda nao pode fecha-lo, pois eu ainda tenho algumas perguntas a fazer.
Estou mexendo nessa rotina de permissoes de acesso e ja vi que tenho algumas duvidas mas ainda nao formulei as perguntas.
Ja vi que no arquivo Web.SiteMap eu posso definir as roles para as quais determinada opcao do menu estara acessivel, digo liberada para o usuario e outras coisas mais.Primeiro irei experimenta-las e ver o que acontece e depois postarei.
E ja que voce falou em criticas, aqui vai uma.
Digamos que e um saco ter que digitar toda hora esse codigo de confirmacao, apenas para voce responder uma pergunta/resposta.
Um Abraco
Sidnei
GOSTEI 0
[devmedia .net]
17/02/2009
Oi Sidnei,
Fique à vontade para fazer críticas e sugestões,
os responsáveis pelo sistema de chamados já estão analisando sua reclamação e eu lhe darei um retorno.
Quanto ao chamado, eu aguardo seu retorno,
no que precisar cara, conte comigo, estou aqui para lhe ajudar e eu não ficarei satisfeito se não resolver seu problema.
Você consegue colocar as restrições sim pelo sitemap , mas foge do que você deseja que é não utilizar a aplicação do Visual Studio para administrar o site...
No aguardo
Abraços
Carlos Jr
GOSTEI 0
Devmedia
17/02/2009
Sidnei,
com relação a sua sugestão, estamos trabalhando nela.
Desde já agradecemos pela sua compreensão
com relação a sua sugestão, estamos trabalhando nela.
Desde já agradecemos pela sua compreensão
GOSTEI 0
[devmedia .net]
17/02/2009
Oi Sidnei, blz ?
estou aguardando seu retorno, para darmos continuidade ao chamado. Abraços Carlos Jr
estou aguardando seu retorno, para darmos continuidade ao chamado. Abraços Carlos Jr
GOSTEI 0
Sidnei Silva.
17/02/2009
ok, obrigado
Ainda estou resolvendo esse assunto.
Um Abraco
GOSTEI 0
[devmedia .net]
17/02/2009
Sidnei, tudo bem ?
Não posso deixar o chamado aberto, sem andamento...
Aguardo seu contato,
caso contrário terei que fechar o mesmo...
Abraços
Carlos Jr
GOSTEI 0
Sidnei Silva.
17/02/2009
Boa Tarde Carlos, como vai?
Eu nao tenho entrado aqui nos ultimos por isso nao respondi, eu estava mais preocupado em resolver outros problemas.
Acredito ter resolvido temporariamente esse problema.
Voce pode encerrar o chamado, se bem que me parece que ele ja estava concluido quando entrei.
Obrigado e um Abraco
Sidnei
GOSTEI 0