Quais são os principais benefícios do uso de CBAC vs. RBAC ? Quando é melhor usar o CBAC e quando é melhor usar o RBAC?
Estou tentando entender os conceitos gerais do modelo CBAC, mas a ideia geral ainda não está clara para mim.
asp.net-mvc
claims-based-identity
access-control
role-base-authorization
role-based
Mr. Pumpkin
fonte
fonte
Respostas:
Tentarei mostrar como você pode se beneficiar do Controle de Acesso Baseado em Reivindicações em um Contexto do ASP.NET MVC.
Ao usar a autenticação baseada em função, se você tem uma ação para criar cliente e deseja que as pessoas que estão na função 'Venda' possam fazer isso, escreva um código como este:
Mais tarde, você percebeu que, às vezes, as pessoas da função 'Marketing' deveriam poder criar o Cliente. Em seguida, você atualiza seu método Action assim
Agora, você percebeu que algumas das pessoas de marketing não devem ser capazes de criar o Cliente, mas não é possível atribuir uma função diferente para as pessoas que estão no Marketing. Portanto, você é forçado a permitir que todos os profissionais de marketing criem Clientes.
você detectou outro problema, sempre que decidir que o pessoal de Marketing deve ter permissão para criar clientes, é necessário atualizar todos os atributos do Autorizar dos métodos de ação do MVC, compilar seu aplicativo, testar e implantar. Alguns dias depois, você decidiu não fazer marketing, mas alguma outra função deveria ter permissão para executar a tarefa. Pesquise na base de código e exclua todos os 'Marketing' do atributo Autorizar e adicione seu novo nome de função no atributo Autorizar ... solução saudável. Nesse ponto, você perceberia a necessidade de controle de acesso baseado em permissão.
O controle de acesso baseado em permissão é uma maneira de atribuir várias permissões a vários usuários e verificar se um usuário tem permissão para executar uma ação do código em tempo de execução. Depois de atribuir várias permissões a vários usuários, você percebe que precisa permitir que alguns usuários executem algum código se o usuário tiver alguma propriedade como "Usuário do Facebook", "Usuário antigo" etc. Deixe-me dar um exemplo. Digamos que você queira permitir acesso a uma página específica se o usuário estiver conectado usando o Facebook. Agora, você criaria uma permissão 'Facebook' para esse usuário? Não, 'Facebook' não soa como uma permissão. Faz isso? Pelo contrário, parece uma reivindicação. Ao mesmo tempo, as permissões também podem parecer reivindicar !! Portanto, é melhor verificar as reivindicações e permitir o acesso.
Agora, vamos voltar ao exemplo concreto de controle de acesso baseado em declarações.
Você pode definir um conjunto de reivindicações como este:
"CanCreateCustomer", "CanDeleteCustomer", "CanEditCustomer" .. etc.
Agora, você pode decorar o seu Método de ação assim:
(observe: [ClaimAuthorize (Permission = "CanCreateCustomer")] não pode ser incorporado à biblioteca de classes MVC, apenas mostro como exemplo, você pode usar alguma biblioteca de classes que possua essa definição de classe de atributo
Agora, você pode ver que, o método de ação CreateCustomer sempre precisará da permissão 'CanCreateCustomer' e nunca será alterado ou dificilmente será alterado. Portanto, no seu banco de dados, você cria uma tabela de permissões (declarações) e uma relação de permissão do usuário. No seu painel de administração, você pode definir permissão (reivindicação) para cada usuário que pode fazer o que. Você pode atribuir a permissão 'CanCreateCustomer' (reivindicação) a qualquer pessoa que desejar e apenas o usuário permitido poderá criar cliente e o usuário permitido poderá criar apenas cliente e nada mais (a menos que você atribua outras permissões ao mesmo usuário).
Esse modelo de segurança oferece uma prática de código limpo. Além disso, quando você escreve seu método de ação, não precisa pensar em quem pode usar esse método, mas sempre pode ter certeza de que quem estiver usando esse método terá a permissão (reivindicação) dada pelo administrador. Em seguida, o administrador pode decidir quem poderá fazer o que. Não você como desenvolvedor. É assim que sua lógica de negócios é separada da lógica de segurança.
Sempre que alguém entra, seu aplicativo verifica todas as permissões disponíveis para esse usuário e esse conjunto de permissões (reivindicação) estará disponível como propriedades adicionais do usuário conectado no momento (geralmente o conjunto de declarações é armazenado como cookie para o usuário conectado), para que você não precise verificar o conjunto de permissões o tempo todo do banco de dados. A linha inferior é que você obtém mais controle de sua lógica de segurança em seu aplicativo se aplicar o acesso baseado em declarações em vez do acesso baseado em funções. De fato, uma função também pode ser considerada uma reivindicação.
Se o seu aplicativo for muito pouco, em que haveria apenas duas funções: Cliente e Administrador e não haverá chance de o Cliente fazer outra coisa além do que eles devem fazer no seu aplicativo, então, talvez, com base em Funções o controle de acesso servirá ao objetivo, mas à medida que seu aplicativo crescer, você começará a sentir a necessidade de controle de acesso baseado em declarações em algum momento.
fonte
CanCreateCustomer, CanViewAdCampaigns
Implementei modelos de segurança muitas vezes agora e tive que entender também esses conceitos. Tendo feito isso muitas vezes, aqui está minha compreensão desses conceitos.
Quais são as funções
Função = A união de usuários e permissões.
Por um lado, uma função é uma coleção de permissões. Eu gosto de chamá-lo de perfil de permissão. Ao definir uma função, você basicamente adiciona um monte de permissões a essa função; nesse sentido, uma função é um perfil de permissão.
Por outro lado, uma função também é uma coleção de usuários. Se eu adicionar Bob e Alice à função "Gerentes", então "Gerentes" agora conterá uma coleção de dois Usuários, como um Grupo.
A verdade é que uma função é uma coleção de usuários e uma coleção de permissões reunidas. Visualmente, isso pode ser visto como um diagrama de Venn.
O que é um grupo
Grupo = coleção de usuários
Um "grupo" é estritamente uma coleção de usuários. A diferença entre um grupo e uma função é que uma função também possui uma coleção de permissões, mas um grupo possui apenas uma coleção de usuários.
O que é uma permissão
Permissão = O que um sujeito pode fazer
O que é um conjunto de permissões
Conjunto de permissões = uma coleção de permissões
Em um sistema RBAC robusto, as Permissões também podem ser agrupadas como Usuários. Enquanto Grupos são apenas uma coleção de Usuários, um Conjunto de Permissões é apenas uma coleção de Permissões. Isso permite que um administrador adicione coleções inteiras de permissões às funções de uma só vez.
Como usuários, grupos, funções e permissões se reúnem
Em um sistema RBAC robusto, os Usuários podem ser adicionados a uma Função individualmente para criar a coleção de Usuários na Função ou Grupos podem ser adicionados a uma Função para adicionar uma coleção de Usuários à Função ao mesmo tempo. De qualquer maneira, a Função faz com que sua coleção de Usuários seja adicionada individualmente ou adicionando Grupos à Função ou adicionando uma mistura de Usuários e Grupos à Função. As permissões podem ser pensadas da mesma maneira.
As permissões podem ser adicionadas às Funções individualmente para criar a coleção de Permissões dentro da Função ou os Conjuntos de Permissões podem ser adicionados a uma Função. Por fim, uma combinação de permissões e conjuntos de permissões pode ser adicionada a uma função. De qualquer maneira, a Função faz com que sua coleção de Permissões seja adicionada individualmente ou adicionando Conjuntos de Permissões a uma Função.
Todo o objetivo das Funções é casar Usuários com Permissões. Portanto, uma função é a UNIÃO de usuários e permissões.
O que são reivindicações
Reivindicação = O que um Assunto "é"
Reivindicações NÃO são permissões. Como apontado nas respostas anteriores, uma Reivindicação é o que um sujeito "não" não é o que um sujeito "pode fazer".
As declarações não substituem Funções ou Permissões, são informações adicionais que podem ser usadas para tomar uma decisão de Autorização.
Quando usar reivindicações
Eu achei as Declarações úteis quando uma decisão de Autorização precisa ser tomada quando o Usuário não pode ser adicionado a uma Função ou a decisão não se baseia na associação de Usuário à Permissão. O exemplo de um usuário do Facebook causa isso. Um usuário do Facebook pode não ser alguém adicionado a uma "função" ... eles são apenas alguns visitantes autenticados pelo Facebook. Embora não se encaixe perfeitamente no RBAC, é uma informação para tomar uma decisão de autorização.
A @CodingSoft usou a metáfora da boate em uma resposta anterior, que eu gostaria de estender. Nessa resposta, a carteira de motorista foi usada como um exemplo que continha um conjunto de declarações em que a data de nascimento representa uma das declarações e o valor da declaração DateOfBirth é usado para testar a regra de autorização. O governo que emitiu a carteira de motorista é a autoridade que dá autenticidade à reivindicação. Portanto, em um cenário de boate, o segurança na porta examina a carteira de motorista da pessoa, garante que ela foi emitida por uma autoridade confiável, examinando se é ou não um ID falso (ou seja, um ID válido emitido pelo governo), depois analisa a data de nascimento (uma das muitas reivindicações da carteira de motorista) e usa esse valor para determinar se a pessoa tem idade suficiente para entrar no clube. Se então,
Agora, com essa base em mente, gostaria de estender isso ainda mais. Suponha que o prédio onde fica a boate contenha escritórios, salas, cozinha, outros andares, elevadores, porão, etc., onde apenas os funcionários do clube possam entrar. Além disso, certos funcionários podem ter acesso a determinados lugares que outros funcionários podem não ter. Por exemplo, um gerente pode ter acesso a um andar do escritório acima do que outros funcionários não podem acessar. Nesse caso, existem duas funções. Gerente e Funcionário.
Embora o acesso dos visitantes à área de boates públicas seja autorizado por uma única reivindicação, conforme explicado acima, os funcionários precisam ter acesso por função a outras salas restritas não públicas. Para eles, uma carteira de motorista não é suficiente. O que eles precisam é de um crachá de funcionário que eles digitalizem para entrar nas portas. Em algum lugar, existe um sistema RBAC que concede distintivos na função de gerente de acesso ao último andar e distintivos na função de funcionário acessam outras salas.
Se, por qualquer motivo, determinadas salas precisarem ser adicionadas / removidas pela Função, isso pode ser feito usando o RBAC, mas não é adequado para uma Reivindicação.
Permissões no software
Codificar funções no aplicativo é uma má ideia. Isso codifica o objetivo da função no aplicativo. O que o aplicativo deve ter são apenas permissões que funcionam como sinalizadores de recursos. Onde os Sinalizadores de Recursos são acessíveis pela configuração, as Permissões são acessíveis pelo Contexto de Segurança do Usuário, derivado da coleção DISTINCT de Permissões coletadas de todas as Funções em que o Usuário foi colocado. Isso é o que eu chamo de "Permissões Efetivas". O aplicativo deve apresentar apenas um menude possíveis permissões para recursos / ações. O sistema RBAC deve fazer o trabalho de casar essas permissões com os usuários por meio de funções. Dessa forma, não há codificação embutida de Funções e a única vez que uma Permissão é alterada é removida ou adicionada uma nova. Depois que uma Permissão é adicionada ao software, ela nunca deve ser alterada. Ele só deve ser removido quando necessário (ou seja, quando um recurso é descontinuado em uma nova versão) e somente os novos podem ser adicionados.
Uma nota final.
Grant vs Deny
Um sistema RBAC robusto e até mesmo um sistema CBAC devem distinguir entre concessões e negações.
A adição de uma permissão a uma função deve vir com um GRANT ou DENY. Quando as permissões são marcadas, todas as permissões concedidas devem ser adicionadas à lista de permissões efetivas de usuários. Depois de tudo isso, uma lista de Permissões NEGADAS deve fazer com que o sistema remova essas Permissões da lista de Permissões Efetivas.
Isso permite que os administradores "ajustem" as Permissões finais de um assunto. É melhor se as Permissões também puderem ser adicionadas aos Usuários diretamente. Dessa forma, você pode adicionar um Usuário a uma Função de Gerente e eles terão acesso a tudo, mas talvez você queira NEGAR o acesso ao Banheiro da Senhora, porque o Usuário é do sexo masculino. Então, você adiciona o Usuário masculino à Função de Gerente e adiciona uma Permissão ao objeto Usuário com DENY, de forma a remover apenas o acesso ao quarto da Dama.
Na verdade, este seria um bom candidato para uma reivindicação. Se o Usuário tem uma Reivindicação "gender = male", a função de Gerente dá acesso a todos os quartos, mas o banheiro da Senhora também exige a Reivindicação gender = female e o Banheiro Masculino exige a Reivindicação gender = male. Dessa maneira, não seria necessário configurar uma permissão DENY para usuários do sexo masculino, pois a imposição de reivindicação cuida disso para todos com uma única regra de autorização. No entanto, isso poderia ser feito de qualquer maneira.
O ponto é que, com o DENIAL of Permissions, ele facilita o gerenciamento das funções, pois as exceções podem ser implementadas.
Abaixo está um diagrama que fiz há muito tempo que mostra o modelo RBAC. Não tenho um gráfico para as reivindicações, mas você pode imaginar que são apenas atributos anexados aos usuários onde quer que estejam. Além disso, o diagrama não mostra Grupos (preciso atualizá-lo em algum momento).
Eu espero que isso ajude.
Este é um diagrama do RBAC descrito acima
Atualização em 7 de abril de 2019 Com base no feedback de @Brent (obrigado) ... removeu referências desnecessárias a respostas anteriores e explicou a base original da metáfora de "boate" fornecida pela @CodingSoft para tornar essa resposta compreensível sem ter para ler outras respostas.
fonte
Não concordo plenamente com a resposta de Emran
É ingênuo
A questão é como
é diferente de
Se ambos são igualmente bons, por que precisamos reivindicar?
Eu acho que porque
O conceito de reivindicações é mais genérico comparado ao papel
No contexto do exemplo acima, podemos dizer "CustomerCreator" é uma declaração do tipo "role" fornecida por "Asp.NETroleProvider"
Exemplos adicionais de reivindicações.
"AAA" é uma reivindicação do tipo "MYExamSite.Score" fornecida por "MYExamSite.com"
"Gold" é uma reivindicação do tipo "MYGYM.Membershiptype" fornecido por "MYGYMApp"
fonte
A resposta aceita parece posicionar Funções como um objeto contundente e Reivindicações como uma ferramenta flexível, mas, de outra forma, as faz parecer quase idênticas. Infelizmente, esse posicionamento faz um desserviço ao conceito de reivindicações e pode refletir fundamentalmente um leve mal-entendido de sua finalidade.
As funções existem e fazem sentido apenas dentro de um escopo implícito. Geralmente, esse é um aplicativo ou escopo organizacional (por exemplo, Função = Administrador). Reivindicações, por outro lado, podem ser "feitas" por qualquer pessoa. Por exemplo, a autenticação do Google pode gerar reivindicações, incluindo o "email" de um usuário, anexando esse email a uma identidade. O Google faz a reivindicação, o aplicativo escolhe se deve entender e aceitar essa reivindicação. O próprio aplicativo pode anexar posteriormente uma declaração chamada "authenticationmethod" (como faz o ASP.NET MVC Core Identity) com o valor "Google". Cada declaração inclui um escopo para que seja possível identificar se uma declaração tem significado externo, local ou ambos (ou mais detalhados, conforme necessário).
Os pontos principais são que todas as reivindicações são explicitamente anexadas a uma identidade e incluem um escopo explícito. Naturalmente, essas declarações podem ser usadas para autorização - e o ASP.NET MVC fornece suporte para isso por meio do atributo Authorize, mas esse não é o único ou necessariamente o principal objetivo das declarações. Certamente não o distingue das Funções, que podem ser usadas exatamente da mesma maneira para a autorização com escopo local.
Portanto, pode-se optar por usar Funções, ou Reivindicações, ou ambas, com a finalidade de autorização e provavelmente não encontrará nenhuma vantagem ou desvantagem inerente, desde que essas Funções e Reivindicações tenham escopo local. Mas se, por exemplo, a autorização depender de reivindicações de identidade externa, as Funções serão inadequadas. Você precisaria aceitar a reivindicação externa e convertê-la em uma função com escopo local. Não há necessariamente nada de errado nisso, mas introduz uma camada de indireto e descarta o contexto.
fonte
Mais amplamente, você deve considerar o ABAC (controle de acesso baseado em atributos). RBAC e ABAC são conceitos definidos pelo NIST, o Instituto Nacional de Padrões e Tecnologia. O CBAC, por outro lado, é um modelo promovido pela Microsoft que é muito semelhante ao ABAC.
Leia mais aqui:
fonte
O fundamental entre o RBAC e o CBAC é que:
RBAC : um usuário deve estar designado a uma função para estar autorizado a executar uma ação.
CBAC : o usuário deve ter uma reivindicação com o valor correto, conforme esperado pelo aplicativo, para ser autorizada. O controle de acesso baseado em declarações é elegante para escrever e mais fácil de manter.
Além de que as reivindicações são emitidas para o aplicativo por um serviço de autorização de emissão (Security Service Token STS), que é confiável pelo seu aplicativo (Parte Confiante)
fonte
A função é apenas um tipo de reivindicação. Assim, pode haver muitos outros tipos de declaração, por exemplo, o nome de usuário é um dos tipos de declaração
fonte
É importante primeiro analisar para que é necessária a autenticação antes de decidir qual método é o melhor. Na documentação da Microsoft abaixo, ele diz "Uma reivindicação não é o que o sujeito pode fazer. Por exemplo, você pode ter uma carteira de motorista emitida por uma autoridade local da carteira de motorista. Sua carteira de motorista tem sua data de nascimento. Nesse caso o nome da reivindicação seria DateOfBirth, o valor da reivindicação seria sua data de nascimento, por exemplo, 8 de junho de 1970 e o emissor seria a autoridade da carta de condução.A autorização baseada em declarações, na sua forma mais simples, verifica o valor de uma reivindicação e permite o acesso a um recurso com base nesse valor. Por exemplo, se você deseja acessar uma boate, o processo de autorização pode ser: 6 "
A partir deste exemplo, podemos ver que o acesso a um clube noturno com uma Autorização Baseada em Reivindicações é diferente do tipo de Autorização exigida pela equipe que trabalha na boate. Nesse caso, a equipe da boate exigirá uma Autorização baseada em função que não é necessária para os visitantes da boate, pois todos os visitantes da boate têm um objetivo comum na boate; portanto, nessa situação, uma Autorização Baseada em Reivindicações é adequada para os visitantes da boate.
Autorização baseada em função https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles 14/10/2016 Quando uma identidade é criada, ela pode pertencer a uma ou mais funções. Por exemplo, Tracy pode pertencer às funções de Administrador e Usuário, enquanto Scott pode pertencer apenas à função de Usuário. O modo como essas funções são criadas e gerenciadas depende do armazenamento de backup do processo de autorização. As funções são expostas ao desenvolvedor por meio do método IsInRole na classe ClaimsPrincipal.
Autorização baseada em declarações https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims 14/10/2016 Quando uma identidade é criada, ela pode receber uma ou mais reivindicações emitidas por uma parte confiável. Uma afirmação é um par de valores de nome que representa o que o sujeito é, não o que o sujeito pode fazer. Por exemplo, você pode ter uma carteira de motorista emitida por uma autoridade local da carteira de motorista. Sua carteira de motorista tem sua data de nascimento. Nesse caso, o nome da reivindicação seria DateOfBirth, o valor da reivindicação seria sua data de nascimento, por exemplo, 8 de junho de 1970 e o emissor seria a autoridade da carta de condução. A autorização baseada em declarações, na sua forma mais simples, verifica o valor de uma reivindicação e permite o acesso a um recurso com base nesse valor. Por exemplo, se você deseja acessar uma boate, o processo de autorização pode ser:
O responsável pela segurança da porta avaliará o valor da sua reivindicação de data de nascimento e se eles confiam no emissor (a autoridade da carta de condução) antes de conceder o acesso.
Uma identidade pode conter várias reivindicações com vários valores e pode conter várias reivindicações do mesmo tipo.
fonte
Também é possível gerenciar funções de maneira reivindicatória.
Em vez de criar funções de autorização que refletem uma função comercial, crie funções que refletem funções de ação, por exemplo, CreateCustomer, EditCustomer, DeleteCustomer. Anote os métodos conforme necessário.
Não é uma questão simples mapear indivíduos para um conjunto de papéis de ação, especialmente quando a lista de papéis aumenta. Portanto, você precisará gerenciar as funções de negócios em um nível mais baixo de granularidade (por exemplo, Vendas, Marketing) e mapear a Função de negócios para as funções de ação necessárias. Ou seja, adicione um usuário a uma função comercial e ele os mapeia para as funções (ação) necessárias na tabela de autorização existente.
Você pode até substituir a função comercial e adicionar uma pessoa diretamente a uma função de ação.
Como você constrói sobre o que já funciona, não desfaz o processo de autorização existente. Você precisa de apenas mais algumas tabelas para implementar essa abordagem
fonte
Eu acho que essa pergunta pode ser respondida a partir do banco de dados em potencial. se você notou como as tabelas envolvidas nesta implantação, você encontrará as seguintes
O uso dessas tabelas pode ser ajustado em um momento da vida útil do usuário / aplicativo para atender às necessidades específicas.
Considere o estágio inicial do "Gerente de compras" (PM), poderíamos ter três abordagens
O aplicativo preenche o AspNetUserRoles com uma linha para conceder o direito de compra de 'PM'. Para emitir um pedido de compra com qualquer quantia, o usuário precisa apenas da função "PM".
O aplicativo preenche o AspNetUserRoles com uma linha para conceder o direito de compra de 'PM' e preenche o AspNetUserClaims uma reivindicação do tipo 'Valor da compra' e do tipo "<1000" para definir o limite de valor. Para emitir um pedido de compra, o usuário precisa ter 'PM' e o valor do pedido ser menor que o valor da reivindicação TIPO 'Valor da Compra'.
O aplicativo preenche o AspNetUserClaims com a reivindicação do tipo TYPE 'Purchasing Amount' e o valor "<1000". Qualquer usuário pode emitir um pedido de compra, considerando o valor inferior ao valor da reivindicação TYPE 'Valor de compra' para esse usuário.
Como pode ser observado, a função é granulada de direitos rígidos que simplificariam a vida do usuário do aplicativo do ponto de vista do gerenciamento do sistema. no entanto, limitará as habilidades do usuário do ponto de vista dos requisitos de negócios. Por outro lado, a reivindicação é baseada em direitos muito bons que precisam ser atribuídos a cada usuário. baseado em reivindicações empurrará os negócios também para o limite, no entanto, tornará o gerenciamento do sistema muito complexo.
fonte
Controle de Acesso Baseado em Função (RBAC)
Na sua organização, você pode ter as seguintes funções
Empregado
Gerente
RH
Dependendo da função ou das funções às quais o usuário conectado pertence, você pode ou não autorizar o acesso a determinados recursos no aplicativo. Como estamos usando Funções para fazer verificações de autorização, isso geralmente é chamado de Controle de Acesso Baseado em Função (RBAC) ou Autorização Baseada em Função.
No ASP.NET Core para implementar a autorização baseada em função, usamos o atributo Authorize com o parâmetro Roles.
Controle de Acesso Baseado em Reivindicações (CBAC)
O que é reivindicação? Uma reivindicação é um par nome-valor. É realmente uma informação sobre o usuário, não o que o usuário pode e não pode fazer. Por exemplo, nome de usuário, email, idade, sexo, etc, são todas reivindicações. Como você usa essas reivindicações para verificações de autorização em seu aplicativo é com os requisitos de negócios e autorização do aplicativo.
Por exemplo, se você estiver criando um portal para funcionários, poderá permitir que o usuário conectado solicite uma licença de maternidade se o valor da reivindicação de gênero for feminino. Da mesma forma, se você estiver criando um aplicativo de comércio eletrônico, poderá permitir que o usuário conectado envie um pedido se o valor da reivindicação de idade for maior ou igual a 18.
As reivindicações são baseadas em políticas. Criamos uma política e incluímos uma ou mais reivindicações nessa política. A política é então usada junto com o parâmetro policy do atributo Authorize para implementar a autorização baseada em declarações.
fonte