Pergunta

Há muitas perguntas (e informações) sobre como configurar a associação ao asp.net, provedores de funções e similares.Se você deve ou não usar a plataforma integrada fornecida pela Microsoft ou estender a função das classes base e definir a sua própria função.

Decidi estender os provedores padrão e implementar meus próprios provedores de associação e funções.Agora, minha pergunta é especificamente sobre autenticação de função.

Tradicionalmente, você criaria funções como 'Gerente, Administrador, Funcionário, Superusuário' ou o que você tiver.Mas o que você faria/deveria fazer em relação às permissões que considero um controle mais refinado?Deixe-me elaborar....

Dentro do meu site asp.net mvc tenho diferentes áreas como administração, gerenciamento, mensagens, relatórios etc.Eu criaria funções para cada um deles, como 'Administrador', 'Gerente', 'Repórter' etc.Sem a função apropriada, você não poderá obter acesso a essa área do site.Então, eu bloquearia todos os controladores com isso no nível da classe.

Mas agora tomemos uma área como exemplo;mensagens e dizer que queria ter permissões mais detalhadas para CRUD;criar uma mensagem, visualizar/ler mensagens, editar mensagens, excluir mensagens etc.

Finalmente minha pergunta.Como seria melhor implementar esse controle mais refinado?Uma abordagem que vejo (não tenho certeza se é boa) é apenas criar funções de associação do asp.net para tudo.Então eu poderia ter....

Messenger (função de nível amplo), CreateMessage, ReadMessage, EditMessage, DeleteMessage.

Por um lado, gostaria que alguns usuários pudessem ler/visualizar mensagens.Mas não necessariamente crie ou exclua-os.As ações individuais do controlador podem ter funções específicas aplicadas.

Você vê algum problema com essa abordagem?Você tem uma ideia melhor?

Solução até agora

Decidi criar meu próprio esquema e implementar associações personalizadas e provedores de funções.Meu esquema inclui;

  • Do utilizador
  • Perfil de usuário
  • Permissão
  • Atribuição de permissão
  • Papel
  • Atribuição de função

Estarei ausente por um ou dois dias, mas atualizarei com mais informações quando tiver oportunidade.

Foi útil?

Solução

Eu acho que você deveria esquecer as funções no mecanismo de autorização, em vez disso pedir permissões (no final, uma função é um agrupamento de permissões), então se você olhar dessa forma, seu Authorize O atributo deve solicitar uma entidade e ação, não uma função específica.Algo como:

[Authorize(Entities.Message, Actions.Create)]
public ActionResult CreateMessage()

[Authorize(Entities.Message, Actions.Edit)]
public ActionResult EditMessage()

[Authorize(Entities.Message, Actions.View)]
public ActionResult ViewMessage()

Dessa forma, suas funções fazem o que fazem de melhor: abstraem a coleta de permissões em vez de determinar uma forma inflexível de nível de acesso.

EDITAR: Para lidar com regras específicas como a apontada por David Robbins, o Gestor A não tem permissão para apagar mensagens criadas pelo Gestor B, supondo que ambos tenham a permissão necessária para acessar esta Ação do Controlador, o Autorizar não é responsável por verificar este tipo de regras, e mesmo se você tentar verificar isso no nível do Filtro de Ação, será um problema, então o que você pode fazer é estender a validação do Authorize para o ActionResult (injetando um parâmetro de ação contendo o resultado da validação) e deixar o ActionResult tomar a decisão lógica lá com todos os argumentos em vigor.

Esse é uma pergunta semelhante, não é exatamente o caso apontado aqui, mas é um bom ponto de partida para estender a validação de autorização com parâmetros de ação.

Outras dicas

Com relação ao seu exemplo de crud, você não está realmente falando sobre autorização, e a autorização varia entre os papéis de associação "gerente" e "repórter"?Acho que você precisa criar um mecanismo separado para as atividades mais refinadas, se as funções não distinguem entre uma autorização de leitura e gravação entre as mensagens.

Se você fosse criar uma função para cada ação - EditMessage, deleteMessage - O que você fará no caso quando o gerente não deve excluir mensagens para o gerente B?

Bem como adicionar [Authorize(Roles="Administrator")] etc acima do seu controlador.Você também pode coloque esse atributo nas ações individuais também

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top