Representação e delegação de clientes

Em algumas circunstâncias, um aplicativo de servidor precisa apresentar a identidade de um cliente aos recursos que ele acessa em nome do cliente, geralmente para fazer com que verificações de acesso ou autenticação sejam executadas em relação à identidade do cliente. Até certo ponto, o servidor pode agir sob a identidade do cliente — uma ação conhecida como representar o cliente.

Representação é a capacidade de um thread de executar em um contexto de segurança diferente daquele do processo que possui o thread. O thread do servidor usa um token de acesso que representa as credenciais do cliente e, com isso, ele pode acessar recursos que o cliente pode acessar.

O uso da representação garante que o servidor possa fazer exatamente o que o cliente pode fazer. O acesso aos recursos pode ser restrito ou expandido, dependendo do que o cliente tem permissão para fazer.

Você pode optar por fazer com que um servidor represente um cliente ao se conectar a um banco de dados para que o banco de dados possa autenticar e autorizar o cliente por si mesmo. Ou, se o aplicativo acessar arquivos protegidos com um descritor de segurança e permitir que o cliente obtenha acesso autorizado às informações nesses arquivos, o aplicativo poderá representar o cliente antes de acessar os arquivos.

Como implementar a representação

A representação requer a participação do cliente e do servidor (e, em alguns casos, dos administradores do sistema). O cliente deve indicar sua disposição de permitir que o servidor use sua identidade, e o servidor deve assumir explicitamente a identidade do cliente programaticamente. Para obter detalhes, consulte os tópicos Requisitos do lado do cliente para representação e Requisitos do lado do servidor para representação.

Requisitos administrativos para representação em nível de delegado

Para usar efetivamente a forma mais poderosa de representação, a delegação, que é a representação de clientes pela rede, as contas de usuário do cliente e do servidor devem ser configuradas corretamente no Serviço do Active Directory para oferecer suporte a ela (além da autoridade de concessão do cliente para fazer representação em nível de delegado), da seguinte maneira:

  • A identidade do servidor deve ser marcada como "Confiável para delegação" no Serviço Active Directory.
  • A identidade do cliente não deve ser marcada como "A conta é confidencial e não pode ser delegada" no Serviço Active Directory.

Esses recursos de configuração dão ao administrador de domínio um alto grau de controle sobre a delegação, o que é desejável, dada a quantidade de confiança (e, portanto, o risco de segurança) envolvida. Para obter mais detalhes sobre delegação, consulte Delegação e representação.

Camuflagem

Juntamente com a autoridade que um cliente concede a um servidor por meio do nível de representação, o recurso de camuflagem do servidor determina em grande parte como a representação se comportará. O cloaking afeta qual identidade é realmente apresentada pelo servidor quando ele faz chamadas em nome do cliente — seu próprio ou do cliente. Para obter detalhes, consulte Cloaking.

Implicações de desempenho

A representação pode afetar significativamente o desempenho e o dimensionamento. Geralmente, é mais caro se passar por um cliente em uma chamada do que fazer a chamada diretamente. A seguir estão algumas das questões a serem consideradas:

  • A sobrecarga computacional de passar a identidade em padrões complicados, particularmente se o encobrimento dinâmico estiver habilitado.
  • A complexidade geral de aplicar verificações de segurança redundantes em vários lugares, em vez de apenas centralmente na camada intermediária.
  • Recursos como conexões de banco de dados, quando abertos representando um cliente, não podem ser reutilizados em vários clientes — um obstáculo muito grande para dimensionar bem.

Às vezes, a única solução eficaz para um problema é usar a imitação, mas essa decisão deve ser cuidadosamente ponderada. Para obter mais informações sobre esses problemas, consulte Segurança de aplicativos de várias camadas.

Componentes em fila

Os componentes em fila não oferecem suporte à representação. Quando um cliente faz uma chamada para um objeto em fila, a chamada é realmente feita para o gravador, que a empacota como parte de uma mensagem para o servidor. Em seguida, o ouvinte lê a mensagem da fila e a passa para o player, que invoca o componente de servidor real e faz a mesma chamada de método. Dessa forma, quando o servidor recebe a chamada, o token do cliente original não está disponível por meio de representação. No entanto, a segurança baseada em função ainda se aplica, e a segurança programática usando a interface ISecurityCallContext funcionará. Para obter detalhes, consulte Segurança de componentes em fila.

Autenticação de cliente

Segurança de aplicativos de biblioteca

Segurança de aplicativos de várias camadas

Segurança de componentes programáticos

Administração de segurança baseada em função

Usando a diretiva de restrição de software no COM+