Permissões / modelo / padrão certos para aplicativos .NET

9

Preciso implementar flexível E simples (se existir) e, ao mesmo tempo, utilizar meios embutidos, se possível

Até agora, tenho MembershipProvider e RoleProviders implementados. Isso é legal, mas para onde eu vou a seguir?

Eu sinto que preciso adicionar o termo "Priviledge" e codificar os que estão dentro do aplicativo. Os usuários configuram funções para adicionar privilégios às funções e atribuir funções aos usuários.

Isso soa como um bom modelo? Devo pensar em adicionar privilégios no nível do usuário, além de adicioná-los às funções? Eu poderia, mas imagino problemas com a instalação (confusa) e o suporte a seguir.

Se eu não fizer isso, e alguns usuários específicos precisarão de privilégios menores - o administrador precisará criar outra função, etc.

Alguma bala de prata para um sistema como este? E por que a Microsoft não foi além dos provedores de associação e função?

Outra idéia: deixe as funções como detentoras de "privilégios" e codifique-as. Então eu posso codificar para essas funções dentro do aplicativo usando todas as marcações / atributos disponíveis, etc. - toda a Microsoft.

Adicione uma nova entidade "Grupo" e crie um relacionamento como este

  • Comercial
  • Grupos de usuários
  • Grupos
  • RoleGroups
  • Funções

Dessa forma, eu posso coletar Funções em grupos e atribuir esses grupos aos Usuários. Parece ótimo e combina com outros padrões de software. Mas não consigo realmente implementar coisas no RoleProvider como:

  • AddUsersToRoles
  • RemoveUsersFromRoles

E algumas coisas realmente não fazem mais sentido porque serão codificadas

  • DeleteRole
  • CreateRole
Katit
fonte

Respostas:

5

Se a autorização baseada em função não for granular o suficiente para você, considere usar a Autorização Baseada em Declarações .

Uma declaração descreve um recurso e uma atividade - como uma entrada em uma ACL, mas mais flexível, porque o "recurso" não precisa ser um objeto físico, pode ser qualquer coisa que você queira e pode conter qualquer informação você quer.

Nesse modelo, uma declaração é equivalente ao que você chama de "privilégio" e agrupa declarações em conjuntos de declarações, que são aproximadamente equivalentes ao que você chama de "função". Todas essas APIs e mais já estão no System.IdentityModelespaço para nome.

Claro que você mencionou MembershipProvidere RoleProvidere se você está tentando empinar tudo isso para o modelo de associação ASP.NET (como os nomes sugerem), em seguida, basta esquecê-la. Se você deseja usar essas APIs de provedor, deve fazê-lo da maneira que preferir, e a maneira como elas não se torna mais granular do que o conceito de uma função.

Em vez disso, no ASP.NET, o conceito de "privilégio" é realmente codificado no nível da ação ou operação , em que você declara quais funções têm permissão para executar essa ação. Isso é realmente muito mais fácil de lidar no ASP.NET MVC, onde você apenas dá um tapa [AuthorizeAttribute]em controladores ou ações do controlador; no ASP.NET "antiquado", você está lidando com eventos, portanto, a autorização tende a ser ad-hoc ou no nível da página (ou em ambos).

Aaronaught
fonte
Muita informação excelente, obrigado! O aplicativo é realmente o aplicativo Silverlight com parte do servidor exposta como serviço RESTful do WCF. Baseado em declarações parece interessante, mas eu não percebi o conceito de usuário e autorização dentro dele. Artigo interessante que eu acabei de encontrar: geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
katit
@ Katit: Praticamente toda autenticação / autorização no .NET é baseada na interface IPrincipal . Se você estiver fazendo a autorização baseada em reivindicações então você usar um IClaimsPrincipal para isso, e lançou o IPrincipalpara IClaimsPrincipalquando você quer fazer verificações de reivindicação. Você escreverá muito do seu próprio código se quiser ajustá-lo (por exemplo) à Autenticação de Formulários, mas obviamente isso pode ser feito (conforme o link).
Aaronaught
a questão é .. Talvez seja mais fácil adicionar outro nível de "Grupo" aos provedores de associação / função ou escrever o próprio provedor? Praticamente mesma quantidade de trabalho como implementar os Microsoft
katit
3
@ Katit: Últimas palavras famosas. Não invente o seu próprio, a menos que tenha um bom motivo para inventar o seu próprio ("parece mais fácil" não é um bom motivo; só parece mais fácil quando você não teve experiência direta e, portanto, não tem capacidade de julgar o que é seu. quantidade de trabalho necessária).
Aaronaught