Gerenciamento de declarações e autorizações com o modelo de identidade

Autorização é o processo de determinar quais entidades têm permissão para alterar, exibir ou acessar um recurso de computador. Por exemplo, em uma empresa, talvez apenas gerentes tenham permissão para acessar os arquivos de seus funcionários. O WCF (Windows Communication Foundation) dá suporte a dois mecanismos para realizar o processamento de autorização. O primeiro mecanismo permite controlar a autorização usando constructos de CLR (Common Language Runtime) existentes. O segundo é um modelo baseado em declarações conhecido como Modelo de Identidade. O WCF usa o Modelo de Identidade para criar declarações de mensagens de entrada. As classes do Modelo de Identidade podem ser estendidas para dar suporte a novos tipos de declaração para esquemas de autorização personalizados. Este tópico apresenta uma visão geral dos principais conceitos de programação do recurso de Modelo de Identidade, bem como uma lista das classes mais importantes que o recurso usa.

Cenários de Modelo de Identidade

Os cenários a seguir representam o uso do Modelo de Identidade.

Cenário 1: suporte para declarações de identidade, função e grupo

Os usuários enviam mensagens a um serviço Web. Os requisitos de controle de acesso do serviço Web usam identidade, funções ou grupos. O remetente da mensagem é mapeado para um conjunto de funções ou grupos. As informações de função ou grupo são usadas para executar verificações de acesso.

Cenário 2: suporte para declarações avançadas

Os usuários enviam mensagens a um serviço Web. Os requisitos de controle de acesso do serviço Web exigem um modelo mais avançado do que de identidade, funções ou grupos. O serviço Web determina se um usuário tem acesso a um recurso protegido específico usando o modelo baseado em declarações avançadas. Por exemplo, um usuário pode ser capaz de ler informações específicas, como informações de salário, às quais outros usuários não têm acesso.

Cenário 3: mapeando declarações diferentes

Um usuário envia uma mensagem a um serviço Web. O usuário pode especificar as respectivas credenciais de várias maneiras diferentes: certificado X.509, token de nome de usuário ou token Kerberos. O serviço Web precisa executar verificações de controle de acesso da mesma maneira, independentemente do tipo de credencial do usuário. Se houver suporte para tipos de credenciais adicionais com o decorrer do tempo, o sistema deverá evoluir adequadamente.

Cenário 4: determinando o acesso a vários recursos

Um serviço Web tenta acessar vários recursos. O serviço determina a quais recursos protegidos um usuário tem acesso comparando as declarações associadas ao usuário com as declarações necessárias para acessar o recurso.

Termos do Modelo de Identidade

A lista a seguir define os principais termos usados para descrever os conceitos do Modelo de Identidade.

Política de autorização
Um conjunto de regras para mapear um conjunto de declarações de entrada para um conjunto de declarações de saída. A avaliação da política de autorização leva à adição de conjuntos de declarações a um contexto de avaliação e, posteriormente, a um contexto de autorização.

Contexto de autorização
Um conjunto de conjuntos de declarações e zero ou mais propriedades. O resultado da avaliação de uma ou mais políticas de autorização.

Declaração
Uma combinação de um tipo de declaração, um direito e um valor.

Conjunto de declarações
Um conjunto de declarações emitidas por um emissor específico.

Tipo de declaração
Uma espécie de declaração. Declarações definidas pela API do Modelo de Identidade são propriedades da classe ClaimType. Dns, Email, Hash, Name, Rsa, Sid, Spn, System, Thumbprint, Uri, e X500DistinguishedName são exemplos de tipos de declaração fornecidos pelo sistema.

Contexto de avaliação
Um contexto no qual uma política de autorização é avaliada. Contém propriedades e conjuntos de declarações. Torna-se a base de um contexto de autorização após a avaliação ser concluída.

Declaração de identidade
Uma declaração cujo direito é a identidade.

Emissor
Um conjunto de declarações que contém pelo menos uma declaração de identidade e que considera-se que emitiu outro conjunto de declarações.

Propriedades
Um conjunto de informações associadas a um contexto de avaliação ou contexto de autorização.

Recurso protegido
Algo no sistema que poderá ser usado, acessado ou manipulado apenas se determinados requisitos forem atendidos.

Direita
Uma capacidade em um recurso. Os direitos definidos pela API do Modelo de Identidade são propriedades da classe Rights. Exemplos de direitos fornecidos pelo sistema são Identity e PossessProperty.

Valor
Algo sobre o qual um direito é declarado.

Declarações

O Modelo de Identidade é um sistema baseado em declarações. As declarações descrevem as capacidades associadas a uma entidade no sistema, geralmente um usuário desse sistema. O conjunto de declarações associado a uma determinada entidade pode ser considerado uma chave. As declarações específicas definem a forma dessa chave, de modo semelhante a uma chave física usada para abrir uma fechadura em uma porta. As declarações são usadas para obter acesso aos recursos. O acesso a um recurso protegido é determinado comparando as declarações necessárias para acessar esse recurso com as declarações associadas à entidade que está tentando acessar.

Uma declaração é a expressão de um direito em relação a um valor específico. Um direito pode ser algo como "Read", "Write" ou "Execute". Um valor pode ser um banco de dados, um arquivo, uma caixa de correio ou uma propriedade. As declarações também têm um tipo. A combinação de tipo de declaração e direito fornece o mecanismo para especificar as capacidades com relação ao valor. Por exemplo, uma declaração do tipo "File" com direito "Read" sobre o valor "Biography.doc" indica que a entidade à qual essa declaração está associada tem acesso de leitura ao arquivo Biography.doc. Uma declaração do tipo "Name" com o direito "PossessProperty" sobre o valor "Martin" indica que a entidade com a qual a declaração está associada possui uma propriedade Name com o valor "Martin".

Embora vários tipos de declaração e direitos sejam definidos como parte do Modelo de Identidade, o sistema é extensível, permitindo que os vários sistemas baseados na infraestrutura do Modelo de Identidade definam tipos de declaração e direitos adicionais conforme necessário.

Declarações de identidade

Um direito específico é o da identidade. As declarações que possuem esse direito fazem uma afirmação sobre a identidade da entidade. Por exemplo, uma declaração do tipo "user principal name" (UPN) com um valor de someone@example.com e um direito Identity indica uma identidade específica em um domínio específico.

Declaração de identidade System

O Modelo de Identidade define uma declaração de identidade: System. A declaração de identidade System indica que uma entidade é o aplicativo ou sistema atual.

Conjuntos de declarações

O modelo de declarações que representam a identidade é importante porque as declarações sempre são emitidas por uma entidade no sistema, mesmo que essa entidade seja, em última análise, algum conceito de "si mesma". As declarações são agrupadas como um conjunto e cada conjunto tem um emissor. Um emissor é apenas um conjunto de declarações. Essa relação recursiva precisa, em algum momento, acabar e qualquer conjunto de declarações pode ser o próprio emissor.

A figura a seguir mostra um exemplo de três conjuntos de declarações em que um conjunto tem, como emissor, outro conjunto que, por sua vez, tem a declaração System definida como emissor. Portanto, conjuntos de declarações formam uma hierarquia que pode ser arbitrariamente profunda.

Sets of claims within the hierarchy.

Vários conjuntos de declarações podem ter o mesmo conjunto de declarações emissor, conforme ilustrado na seguinte figura:

Multiple sets of claims with the same issuing claim set.

Com exceção de um conjunto de declarações que é seu próprio emissor, o Modelo de Identidade não dá suporte para que conjuntos de declarações formem um loop. Portanto, uma situação em que o conjunto de declarações A é emitido pelo conjunto de declarações B, que é emitido pelo conjunto de declarações A, nunca pode ocorrer. Além disso, o Modelo de Identidade não dá suporte para que os conjuntos de declarações tenham vários emissores. Se dois ou mais emissores precisarem emitir um determinado conjunto de declarações, você precisará usar vários conjuntos de declarações, cada um contendo as mesmas declarações, mas com emissores diferentes.

A origem das declarações

As declarações podem ter várias fontes. Uma fonte comum de declarações são as credenciais apresentadas por um usuário, por exemplo, como parte de uma mensagem enviada a um serviço Web. O sistema valida essas declarações e elas se tornam parte de um conjunto de declarações associadas ao usuário. Outros componentes do sistema também podem ser fontes de declarações, incluindo, sem limitações, o sistema operacional, a pilha de rede, o ambiente de tempo de execução ou o aplicativo. Além disso, serviços remotos também podem ser uma fonte de declarações.

Políticas de autorização

No Modelo de Identidade, as declarações são geradas como parte do processo de avaliação da política de autorização. Uma política de autorização examina o conjunto (possivelmente vazio) de declarações existentes e pode optar por adicionar mais declarações com base nas declarações já presentes e em informações adicionais à disposição. Isso proporciona a base do mapeamento entre declarações. A presença ou ausência de declarações no sistema influencia o comportamento de uma política de autorização em relação à adição de mais declarações.

Por exemplo, a política de autorização tem acesso a um banco de dados que inclui as datas de nascimento das várias entidades que usam o sistema. A política de autorização usa essas informações para adicionar uma declaração "Over18" ao contexto. Observe que essa declaração Over18 não divulga nenhuma informação sobre a entidade além do fato de que ela tem mais de 18 anos de idade. Observe que a interpretação da declaração 'Over18' depende da compreensão da semântica dela. A política de autorização que adicionou a declaração entende essa semântica em algum nível. O código que posteriormente examina as declarações resultantes da avaliação da política também é informado sobre essa semântica.

Uma determinada política de autorização pode exigir que ela seja avaliada várias vezes porque, à medida que outras políticas de autorização adicionam declarações, essa política de autorização pode adicionar ainda mais declarações. O Modelo de Identidade foi projetado para continuar a avaliação até que nenhuma outra declaração seja adicionada ao contexto por nenhuma das políticas de autorização em vigor. Essa avaliação contínua das políticas de autorização impede o requisito de impor qualquer ordem de avaliação específica em relação às políticas de autorização; elas podem ser avaliadas em qualquer ordem. Por exemplo, se a política X adicionar a Declaração Z somente se a política A tiver adicionado a Declaração B, e se X for avaliada primeiro, inicialmente ela não adicionará a Declaração Z. Posteriormente, A será avaliada e adicionará a Declaração B. X é avaliada uma segunda vez e, desta vez, adiciona a Declaração Z.

Um determinado sistema pode ter muitas políticas de autorização em vigor.

Uma máquina de fazer chaves

Avaliar um grupo de políticas de autorização associadas é como usar uma máquina que faz chaves. As políticas de autorização são avaliadas e os conjuntos de declarações são gerados, criando a forma da chave. Após a forma da chave ser concluída, ela poderá ser usada para tentar abrir algumas fechaduras. A forma da chave é armazenada em um "contexto de autorização", que é criado por um gerenciador de autorização.

Contexto de autorização

Um gerenciador de autorização avalia as várias políticas de autorização, conforme descrito, e o resultado é um contexto de autorização (um conjunto de conjuntos de declarações e algumas propriedades associadas). O contexto de autorização pode ser examinado para determinar quais declarações estão presentes nele, as relações entre essas várias declarações (por exemplo, o conjunto de declarações emissor) e, por fim, compará-las com alguns requisitos a que devem atender para acessar um recurso.

Locks

Se um contexto de autorização (um conjunto de declarações) for uma chave, os requisitos que devem ser atendidos para conceder acesso a um recurso protegido específico serão a fechadura em que a chave precisa se encaixar. O Modelo de Identidade não formaliza a maneira como esses requisitos são expressos, mas eles envolvem, dada a natureza baseada em declarações do sistema, comparar as declarações no contexto de autorização com algum conjunto de declarações necessárias.

Uma recapitulação

O Modelo de Identidade é baseado no conceito de declarações. As declarações são agrupadas em conjuntos e agregadas em um contexto de autorização. Um contexto de autorização contém um conjunto de declarações e é resultado da avaliação de uma ou mais políticas de autorização associadas a um gerenciador de autorização. Esses conjuntos de declarações podem ser examinados para determinar se os requisitos de acesso foram atendidos. A figura a seguir mostra as relações entre esses vários conceitos do Modelo de Identidade.

Managing claims and authorization

WCF e o Modelo de Identidade

O WCF usa a infraestrutura do Modelo de Identidade como base para executar a autorização. No WCF, a classe ServiceAuthorizationBehavior permite especificar políticas de autorização como parte de um serviço. Essas políticas de autorização são conhecidas como políticas de autorização externas e podem executar o processamento de declarações com base na política local ou por interação com um serviço remoto. O gerenciador de autorização, representado pela classe ServiceAuthorizationManager, avalia políticas de autorização externas junto com políticas de autorização que reconhecem os diversos tipos de credenciais (tokens) e preenche o que é chamado de contexto de autorização com as declarações adequadas para uma mensagem de entrada. O contexto de autorização é representado pela classe AuthorizationContext.

Programação do Modelo de Identidade

A tabela a seguir descreve o modelo de objeto usado para programar extensões do Modelo de Identidade. Todas essas classes existem nos namespaces System.IdentityModel.Policy ou System.IdentityModel.Claims.

Classe Descrição
Componente de autorização Uma classe do Modelo de Identidade que implementa a interface IAuthorizationComponent.
IAuthorizationComponent Uma interface que fornece uma só propriedade de cadeia de caracteres somente leitura: Id. O valor dessa propriedade é exclusivo para cada instância no sistema que implementa essa interface.
AuthorizationContext Um componente de autorização que contém um conjunto de instâncias ClaimSet com zero ou mais propriedades; o resultado da avaliação de uma ou mais Políticas de Autorização.
Claim Uma combinação de um tipo de declaração, um direito e um valor. As partes de direito e valor são restritas pelo tipo de declaração.
ClaimSet Uma classe base abstrata. Uma coleção de instâncias Claim.
DefaultClaimSet Uma classe selada. Uma implementação da classe ClaimSet.
EvaluationContext Uma classe base abstrata. Passada para uma política de autorização durante a avaliação da política.
IAuthorizationPolicy Uma interface derivada de IAuthorizationComponent e implementada por classes de política de autorização.
Rights Uma classe estática que contém valores de direito predefinidos.

As classes a seguir também são usadas para programação do Modelo de Identidade, mas não são encontradas nos namespaces System.IdentityModel.Policy ou System.IdentityModel.Claims.

Classe Descrição
ServiceAuthorizationManager Uma classe que fornece um método — CheckAccessCore— para executar verificações de autorização baseadas em declaração para cada operação em um serviço. Você precisa derivar da classe e substituir o método.
ServiceAuthorizationBehavior Uma classe selada que fornece várias propriedades relacionadas ao comportamento de um serviço no que tange a autorização.
ServiceSecurityContext Uma classe que fornece o contexto de segurança, incluindo o contexto de autorização, para a operação em execução (ou prestes a ser executada). Uma instância dessa classe faz parte do OperationContext.

Membros significativos

Os membros a seguir costumam ser usados para criar tipos de declaração.

Membro DESCRIÇÃO
CheckAccessCore Classes derivadas implementam esse método para executar verificações de acesso baseadas em declarações antes de executar operações em um serviço. Todas as informações no OperationContext fornecido ou em outro lugar podem ser examinadas ao tomar a decisão de verificação de acesso. Se CheckAccessCore retornar true, o acesso será concedido e a operação poderá ser executada. Se CheckAccessCore retornar false, o acesso será negado e a operação não será executada. Para ver um exemplo, consulte Como criar um gerenciador de autorização personalizado para um serviço.
ServiceAuthorizationManager Retorna o ServiceAuthorizationManager do serviço. O ServiceAuthorizationManager é responsável por tomar decisões de autorização.
ExternalAuthorizationPolicies A coleção de políticas de autorização personalizadas especificada para o serviço. Essas políticas são avaliadas além daquelas associadas às credenciais nas mensagens de entrada.

Confira também