Controle de acesso baseado em função (RBAC) x controle de acesso baseado em declarações (CBAC) no ASP.NET MVC

147

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.

Mr. Pumpkin
fonte
1
Esses conceitos ainda são muito vagos para mim. Eles parecem fazer a mesma coisa também. Esse é apenas um papel com um valor?
Zapnologica

Respostas:

262

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:

[Authorize(Roles="Sale")]
public ActionResult CreateCustomer()
{
    return View();
}

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

[Authorize(Roles = "Sale", "Marketing")]
public ActionResult CreateCustomer()
{
    return View();
}

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:

        [ClaimAuthorize(Permission="CanCreateCustomer")]
        public ActionResult CreateCustomer()
        {
            return View();
        }

(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.

Emran Hussain
fonte
10
O que me deixa confuso é como os papéis são considerados nas reivindicações - não estão nas funções de sistemas baseados em declarações basicamente um agrupamento de declarações para que você possa atribuir coisas em massa? por exemplo, você pode dizer que Bob é em função de Marketing e todos em Marketing tem reivindicaçõesCanCreateCustomer, CanViewAdCampaigns
George Mauer
9
Uau, eu tenho tentado descobrir como tudo isso funciona, mas NUNCA entendi todas as explicações e exemplos abstratos vagos. Sua postagem foi a primeira que abriu minha mente e transmitiu a mensagem. Muito obrigado por explicar tão conciso.
Leon Cullens
3
Esta é uma explicação muito cuidadosa, mas acho que você reconheceu que está incompleta com o seu comentário "A diferença está no conceito, e não na tecnologia". Na verdade, há uma diferença na tecnologia, que esta resposta não aborda. Em resumo, discordo que depende de como você define a Função, pois as duas tecnologias atendem a requisitos muito diferentes. Hesito em oferecer correção, pois a resposta em si é muito útil para demonstrar as armadilhas associadas à aplicação de funções (ou reivindicações) de autorização que são muito amplas. Infelizmente essa não foi a pergunta.
cânhamo
6
Suponha que eu queira assim: 1) Uma "permissão" é um direito de executar uma ação simples, como "Criar um cliente". O nome da permissão começa com "can" - CanCreateCustomer. Os nomes das permissões são codificados no código-fonte do aplicativo. 2) Um usuário pode receber um conjunto de permissões - mas não diretamente. O usuário recebe permissões apenas através das funções. 3) Uma função é um conjunto de permissões, nada mais. Alguns usuários finais (administradores) podem criar dinamicamente novas funções personalizadas com permissões de conjunto arbitrárias (escolhidas na lista fixa). A pergunta é: POSSO FAZER ISSO COM ESTE modelo com base em declarações?
Dmitry Arestov
7
A documentação da Microsoft diz: Uma afirmação é um par de valor de nome que representa o que o sujeito é, não o que o sujeito pode fazer.
CodingSoft
61

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.

Ricardo
fonte
3
Esta é uma ótima explicação que deve ser votada ao topo, obrigado por adicionar o exemplo e o diagrama.
Optimae 7/01/19
1
Ótima resposta. Uma recomendação seria remover referências a outras respostas. Cada resposta deve ficar sozinha e, embora eu tenha lido as outras respostas, nem todo mundo o fará.
Brent
Obrigado Brent. Boa ideia. Eu vasculhei a resposta e tentei melhorá-la removendo referências desnecessárias a outras respostas e explicando a base da metáfora da boate para que não exigisse a leitura da outra resposta. Se você tiver mais sugestões de melhorias, terei prazer em aplicá-las prontamente. Obrigado novamente.
Ricardo
Concordado, esta deve ser a melhor resposta. Existem outras boas respostas, mas essa é a mais clara, abrangente e precisa.
Matija Han
isso é incrível e explicado em ótimo idioma normal - obrigado
brinquedo
49

Não concordo plenamente com a resposta de Emran

[Authorize(Roles="Sale")]

É ingênuo

A questão é como

  [Authorize(Roles="CustomerCreator")]

é diferente de

 [ClaimAuthorize(Permission="CanCreateCustomer")]

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.

  1. "AAA" é uma reivindicação do tipo "MYExamSite.Score" fornecida por "MYExamSite.com"

  2. "Gold" é uma reivindicação do tipo "MYGYM.Membershiptype" fornecido por "MYGYMApp"

Pushpendra
fonte
8
Eu acho que essa resposta tem valor, pois aborda a diferença fundamental entre uma reivindicação e sua função equivalente, em vez de descrever um cenário que pode ser efetivamente implementado usando um modelo de autorização baseado em funções ou de declarações. 1
Katstevens 13/07/2015
1
Eu postei um comentário na minha resposta. Eu disse, isso depende de como você define "papel" na sua organização. Você pode definir uma função que soa como Permissão / ou reivindicação. Essa abordagem não o impedirá de alcançar o mesmo objetivo. ROLE geralmente significa "Nomeação"; é assim que os termos usados ​​são usados. A diferença está no conceito, e sim na tecnologia. Se você estiver usando [Authorize (Roles = "CustomerCreator")], será semelhante ao CBAC no sentido abstrato. O debate é sobre se você deve criar Compromissos ou Permissões Mico no seu modelo de segurança. A reivindicação não é apenas sobre permissões, ela oferece mais.
Emran Hussain
É assim que as funções são executadas no MSSQL. ele possui DBDataReader e DBDataWriter, não MyAppDB e HisAppDB.
Behrooz
Como os papéis significam nomeação? No RBAC, as funções são atribuídas com permissões.
Wouter
46

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.

cânhamo
fonte
3
Boa resposta ... Eu acho que entendo você ..., mas seria mais claro se você pudesse fornecer um exemplo concreto (possivelmente no contexto do ASP MVC) ... a resposta é muito abstrata Estou tendo dificuldade em entender minha cabeça em torno dele.
Rosdi Kasim
2
O segundo parágrafo inclui um exemplo concreto relacionado à identidade principal do ASP.NET MVC e à autenticação do Google. Parece uma mais detalhada caminhada-thru do novo modelo da Núcleo ajudaria - por que eu recomendo este artigo: andrewlock.net/introduction-to-authentication-with-asp-net-core
cânhamo
Melhor resposta IMHO
mrmashal 6/09/18
8

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:

David Brossard
fonte
3
Embora a recomendação para usar o controle de acesso baseado em atributo seja excelente. Os links para práticas comuns / melhores de implementá-las nas pilhas MVC / WebAPI seriam agradáveis. Obrigado
Itanex
6

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)

Benjamin Nguyen
fonte
6

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

Venkat Naidu
fonte
6

É 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.

CodingSoft
fonte
2

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

pixelda
fonte
1

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

  1. Usuários AspNet: cada usuário possui uma linha com todos os atributos exigidos por todos, como e-mail, endereço, telefone, senha .....
  2. AspNetRoles; define funções diferentes conforme os requisitos do aplicativo, como GM, CTO, HRM, ADMIN, EMP. o que cada função define é conforme as necessidades do aplicativo.
  3. AspNetUserRoles: cada linha vincula AspNetUsers e AspNetRoles e efetivamente vincula entre um usuário e várias funções.
  4. AspNetUserClaims: cada linha possui chave para AspNetUsers e um tipo e valor. adicione de maneira tão eficaz um atributo para cada usuário que possa ser adicionado / removido em tempo de execução.

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

  1. 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".

  2. 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'.

  3. 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.

Ahmed Bahtity
fonte
0

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.

[Authorize(Roles = "Admin")]
public class AdministrationController : Controller
{
}

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.

[Authorize(Policy = "DeleteRolePolicy")]
public async Task<IActionResult> DeleteRole(string id)
{
}
Alexander Zaldostanov
fonte