Objetos Principal e Identity

Observação

Este artigo aplica-se ao Windows.

Para obter informações sobre o ASP.NET Core, confira Segurança do ASP.NET Core.

O código gerenciado pode descobrir a identidade ou a função de uma entidade de segurança por meio de um objeto IPrincipal, que contém uma referência a um objeto IIdentity. Pode ser útil comparar objetos de identidade e entidade de segurança com conceitos familiares, como contas de usuário e grupo. Na maioria dos ambientes de rede, as contas de usuário representam pessoas ou programas, enquanto as contas de grupo representam determinadas categorias de usuários e os direitos que eles têm. Da mesma forma, os objetos de identidade do .NET representam os usuários, enquanto as funções representam associações e contextos de segurança. No .NET, o objeto principal encapsula um objeto de identidade e uma função. Os aplicativos .NET concedem direitos à entidade de segurança com base em sua identidade ou, mais comumente, em sua associação de função.

Objetos de identidade

O objeto de identidade encapsula informações sobre o usuário ou entidade que está sendo validado. No nível mais básico, os objetos de identidade contêm um nome e um tipo de autenticação. O nome pode ser o nome de um usuário ou o nome de uma conta do Windows, enquanto o tipo de autenticação pode ser um protocolo de logon com suporte, como Kerberos V5, ou um valor personalizado. O .NET define um objeto GenericIdentity que pode ser usado para a maioria dos cenários de logon personalizados e um objeto mais especializado WindowsIdentity que pode ser usado quando você deseja que seu aplicativo confie em autenticação do Windows. Além disso, você pode definir uma classe de identidade própria que encapsula informações personalizadas do usuário.

A interface IIdentity define propriedades para acessar um nome e um tipo de autenticação, como Kerberos V5 ou NTLM. Todas as classes identity implementam a interface IIdentity. Não há nenhuma relação necessária entre um objeto Identity e o token de processo do Windows no qual um thread está sendo executado no momento. No entanto, se o objeto Identity for um objeto WindowsIdentity, será presumido que a identidade representa um token de segurança do Windows.

Objeto de entidade de segurança

O objeto de entidade de segurança representa o contexto de segurança no qual o código está sendo executado. Aplicativos que implementam direitos de concessão de segurança baseados em função conforme a função associada a um objeto de entidade de segurança. Semelhante a objetos de identidade, o .NET fornece um objeto GenericPrincipal e um objeto WindowsPrincipal. Você também pode definir classes de entidade de segurança próprias.

A interface IPrincipal define uma propriedade para acessar um objeto Identity associado, bem como um método para determinar se o usuário identificado pelo objeto Principal é membro de uma determinada função. Todas as classes Principal implementam a interface IPrincipal, bem como todas as propriedades e métodos adicionais necessários. Por exemplo, o common language runtime fornece a classe WindowsPrincipal, que implementa funcionalidade adicional para mapear a associação de grupo a funções.

Um objeto Principal está associado a um objeto de contexto de chamada (CallContext) dentro de um domínio de aplicativo (AppDomain). Um contexto de chamada padrão sempre é criado com cada novo AppDomain, portanto, há sempre um contexto de chamada disponível para aceitar o objeto Principal. Quando um thread é criado, um objeto CallContext também é criado para o thread. A referência do objeto Principal é copiada automaticamente do thread de criação para o CallContext do novo thread. Se o runtime não puder determinar qual objeto Principal pertence ao criador do thread, ele seguirá a política padrão para a criação de objeto Principal e Identity.

Uma política configurável específica do domínio do aplicativo define as regras para decidir que tipo de objeto Principal associar a um novo domínio de aplicativo. Quando a política de segurança permite, o runtime pode criar objetos Principal e Identity que refletem o token do sistema operacional associado ao thread de execução atual. Por padrão, o runtime usa objetos Principal e Identity, que representam usuários não autenticados. O runtime não cria esses objetos Principal e identity padrão até que o código tente acessá-los.

O código confiável que cria um domínio de aplicativo pode definir a política de domínio do aplicativo que controla a construção dos objetos Principal e Identity padrão. Essa política específica do domínio do aplicativo se aplica a todos os threads de execução nesse domínio de aplicativo. Um host não gerenciado e confiável inerentemente tem a capacidade de definir essa política, mas o código gerenciado que define essa política deve ter o System.Security.Permissions.SecurityPermission para controlar a política de domínio.

Ao transmitir um objeto Principal entre domínios de aplicativo, mas dentro do mesmo processo (e, portanto, no mesmo computador), a infraestrutura de comunicação remota copia uma referência ao objeto Principal associado ao contexto do chamador para o contexto do receptor.

Confira também