Open Source Web Application Framework for ASP.NET Core
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

15 KiB

Módulo de Gerenciamento de Identidade

O módulo de identidade é usado para gerenciar funções, usuários e suas permissões, com base na biblioteca de identidade da Microsoft.

Como instalar

Este módulo já vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando get-source CLI) para desenvolver seu próprio módulo personalizado.

O Código-fonte

O código-fonte deste módulo pode ser acessado aqui. O código-fonte é licenciado com MIT, então você pode usá-lo e personalizá-lo livremente.

Interface do Usuário

Este módulo fornece opções de interface do usuário Blazor, Angular e MVC / Razor Pages.

Itens do Menu

Este módulo adiciona um item de menu Gerenciamento de Identidade no menu Administração:

identity-module-menu

Os itens do menu e as páginas relacionadas são autorizados. Isso significa que o usuário atual deve ter as permissões relacionadas para torná-los visíveis. A função admin (e os usuários com essa função - como o usuário admin) já possui essas permissões. Se você deseja habilitar permissões para outras funções/usuários, abra a caixa de diálogo Permissões na página Funções ou Usuários e marque as permissões conforme mostrado abaixo:

identity-module-permissions

Consulte o documento de Autorização para entender o sistema de permissões.

Páginas

Esta seção apresenta as principais páginas fornecidas por este módulo.

Usuários

Esta página é usada para ver a lista de usuários. Você pode criar/editar e excluir usuários, atribuir usuários a funções.

identity-module-users

Um usuário pode ter zero ou mais funções. Os usuários herdam permissões de suas funções. Além disso, você pode atribuir permissões diretamente aos usuários (clicando no botão Ações, em seguida, selecionando Permissões).

Funções

As funções são usadas para agrupar permissões e atribuí-las aos usuários.

identity-module-roles

Além do nome da função, existem duas propriedades de uma função:

  • Padrão: Se uma função for marcada como "padrão", essa função será atribuída aos novos usuários por padrão quando eles se registrarem na aplicação (usando o Módulo de Conta).
  • Público: Uma função pública de um usuário pode ser vista por outros usuários na aplicação. Essa funcionalidade não tem uso no módulo de identidade, mas é fornecida como uma funcionalidade que você pode querer usar em sua própria aplicação.

Outras Funcionalidades

Esta seção abrange algumas outras funcionalidades fornecidas por este módulo que não possuem páginas de interface do usuário.

Unidades Organizacionais

As unidades organizacionais (OU) podem ser usadas para agrupar usuários e entidades de forma hierárquica.

Entidade Unidade Organizacional

Uma OU é representada pela entidade UnidadeOrganizacional. As propriedades fundamentais desta entidade são:

  • TenantId: Id do locatário desta OU. Pode ser nulo para OUs do host.
  • ParentId: Id da OU pai. Pode ser nulo se esta for uma OU raiz.
  • Código: Um código de string hierárquico que é único para um locatário.
  • DisplayName: Nome exibido da OU.

Árvore de Organização

Como uma OU pode ter um pai, todas as OUs de um locatário estão em uma estrutura de árvore. Existem algumas regras para esta árvore:

  • Pode haver mais de uma raiz (onde o ParentId é null).
  • Há um limite para a contagem de filhos de primeiro nível de uma OU (por causa do comprimento fixo da unidade de código OU explicado abaixo).

Código da OU

O código da OU é gerado automaticamente e mantido pelo serviço GerenciadorUnidadeOrganizacional. É uma string que se parece com isso:

"00001.00042.00005"

Este código pode ser usado para consultar facilmente o banco de dados para todos os filhos de uma OU (recursivamente). Existem algumas regras para este código (aplicadas automaticamente quando você usa o GerenciadorUnidadeOrganizacional):

  • É único para um locatário.
  • Todos os filhos da mesma OU têm códigos que começam com o código da OU pai.
  • É de comprimento fixo e baseado no nível da OU na árvore, conforme mostrado no exemplo.
  • Embora o código da OU seja único, ele pode ser alterado se você mover a OU relacionada.

Observe que você deve referenciar uma OU pelo Id, não pelo Código, porque o Código pode ser alterado posteriormente.

Gerenciador de Unidade Organizacional

A classe GerenciadorUnidadeOrganizacional pode ser injetada e usada para gerenciar OUs. Casos de uso comuns são:

  • Criar, atualizar ou excluir uma OU
  • Mover uma OU na árvore de OUs.
  • Obter informações sobre a árvore de OUs e seus itens.

Log de Segurança de Identidade

O sistema de log de segurança registra algumas operações ou alterações importantes em sua conta (como login e alteração de senha). Você também pode salvar o log de segurança, se necessário.

Você pode injetar e usar GerenciadorLogSegurancaIdentidade ou IGerenciadorLogSeguranca para gravar logs de segurança. Ele criará um objeto de log por padrão e preencherá alguns valores comuns, como CreationTime, ClientIpAddress, BrowserInfo, usuário/locatário atual, etc. Claro, você pode substituí-los.

await GerenciadorLogSegurancaIdentidade.SalvarAsync(new ContextoLogSegurancaIdentidade()
{
	Identidade = "IdentityServer",
	Ação = "AlterarSenha"
});

Configure OpcoesLogSegurancaAbp para fornecer o nome do aplicativo (no caso de você ter várias aplicações e desejar distinguir as aplicações nos logs) para o log ou desativar esse recurso.

Configure<OpcoesLogSegurancaAbp>(opcoes =>
{
	opcoes.NomeAplicativo = "AbpSecurityTest";
});

Opções

OpcoesIdentidade é a classe de opções padrão fornecida pela biblioteca de identidade da Microsoft. Portanto, você pode definir essas opções no método ConfigureServices da sua classe de módulo.

Exemplo: Definir o comprimento mínimo necessário das senhas

Configure<OpcoesIdentidade>(opcoes =>
{
    opcoes.Senha.ComprimentoMinimo = 5;
});

O ABP leva essas opções um passo adiante e permite que você as altere em tempo de execução usando o sistema de configurações. Você pode injetar IGerenciadorConfiguracao e usar um dos métodos Set... para alterar os valores das opções para um usuário, um locatário ou globalmente para todos os usuários.

Exemplo: Alterar o comprimento mínimo necessário das senhas para o locatário atual

public class MeuServico : IDependencyTransient
{
    private readonly IGerenciadorConfiguracao _gerenciadorConfiguracao;

    public MeuServico(IGerenciadorConfiguracao gerenciadorConfiguracao)
    {
        _gerenciadorConfiguracao = gerenciadorConfiguracao;
    }

    public async Task AlterarComprimentoMinSenha(int comprimentoMin)
    {
        await _gerenciadorConfiguracao.DefinirParaLocatarioAtualAsync(
            NomesConfiguracaoIdentidade.Senha.ComprimentoMinimo,
            comprimentoMin.ToString()
        );
    }
}

A classe NomesConfiguracaoIdentidade (no namespace Volo.Abp.Identity.Settings) define constantes para os nomes das configurações.

Eventos Distribuídos

Este módulo define os seguintes ETOs (Event Transfer Objects) para permitir que você se inscreva em alterações nas entidades do módulo;

  • UserEto é publicado em alterações feitas em uma entidade IdentityUser.
  • IdentityRoleEto é publicado em alterações feitas em uma entidade IdentityRole.
  • IdentityClaimTypeEto é publicado em alterações feitas em uma entidade IdentityClaimType.
  • OrganizationUnitEto é publicado em alterações feitas em uma entidade OrganizationUnit.

Exemplo: Ser notificado quando um novo usuário for criado

public class MeuManipulador :
    IManipuladorEventoDistribuido<EntityCreatedEto<UserEto>>,
    IDependencyTransient
{
    public async Task ManipularEventoAsync(EntityCreatedEto<UserEto> evento)
    {
        UserEto user = evento.Entity;
        // TODO: ...
    }
}

UserEto e IdentityRoleEto são configurados para publicar automaticamente os eventos. Você deve configurar você mesmo para os outros. Consulte o documento de Distributed Event Bus para aprender detalhes dos eventos pré-definidos.

A inscrição nos eventos distribuídos é especialmente útil para cenários distribuídos (como arquitetura de microsserviços). Se você está construindo uma aplicação monolítica ou ouvindo eventos no mesmo processo que executa o Módulo de Identidade, então a inscrição nos eventos locais pode ser mais eficiente e fácil.

Internos

Esta seção abrange alguns detalhes internos do módulo que você não precisa muito, mas pode precisar usar em alguns casos.

Camada de Domínio

Agregados

Usuário

Um usuário é geralmente uma pessoa que faz login e usa a aplicação.

  • IdentityUser (raiz do agregado): Representa um usuário no sistema.
    • IdentityUserRole (coleção): Funções do usuário.
    • IdentityUserClaim (coleção): Reivindicações personalizadas do usuário.
    • IdentityUserLogin (coleção): Logins externos do usuário.
    • IdentityUserToken (coleção): Tokens do usuário (usados pelos serviços de identidade da Microsoft).
Função

Uma função é tipicamente um grupo de permissões para atribuir aos usuários.

  • IdentityRole (raiz do agregado): Representa uma função no sistema.
    • IdentityRoleClaim (coleção): Reivindicações personalizadas da função.
Tipo de Reivindicação

Um tipo de reivindicação é uma definição de uma reivindicação personalizada que pode ser atribuída a outras entidades (como funções e usuários) no sistema.

  • IdentityClaimType (raiz do agregado): Representa uma definição de tipo de reivindicação. Ele contém algumas propriedades (por exemplo, Obrigatório, Regex, Descrição, ValueType) para definir o tipo de reivindicação e as regras de validação.
Log de Segurança de Identidade

Um objeto IdentitySecurityLog representa uma operação relacionada à autenticação (como login) no sistema.

  • IdentitySecurityLog (raiz do agregado): Representa um log de segurança no sistema.
Unidade Organizacional

Uma unidade organizacional é uma entidade em uma estrutura hierárquica.

  • OrganizationUnit (raiz do agregado): Representa uma unidade organizacional no sistema.
    • Roles (coleção): Funções da unidade organizacional.

Repositórios

Os seguintes repositórios personalizados são definidos para este módulo:

  • IIdentityUserRepository
  • IIdentityRoleRepository
  • IIdentityClaimTypeRepository
  • IIdentitySecurityLogRepository
  • IOrganizationUnitRepository

Serviços de Domínio

Gerenciador de Usuário

IdentityUserManager é usado para gerenciar usuários, suas funções, reivindicações, senhas, e-mails, etc. Ele é derivado da classe UserManager<T> da Microsoft Identity, onde T é IdentityUser.

Gerenciador de Função

IdentityRoleManager é usado para gerenciar funções e suas reivindicações. Ele é derivado da classe RoleManager<T> da Microsoft Identity, onde T é IdentityRole.

Gerenciador de Tipo de Reivindicação

IdenityClaimTypeManager é usado para realizar algumas operações para a raiz do agregado IdentityClaimType.

Gerenciador de Unidade Organizacional

OrganizationUnitManager é usado para realizar algumas operações para a raiz do agregado OrganizationUnit.

Gerenciador de Log de Segurança

IdentitySecurityLogManager é usado para salvar logs de segurança.

Camada de Aplicação

Serviços de Aplicação

  • IdentityUserAppService (implementa IIdentityUserAppService): Implementa os casos de uso da interface do usuário de gerenciamento de usuários.
  • IdentityRoleAppService (implementa IIdentityRoleAppService): Implementa os casos de uso da interface do usuário de gerenciamento de funções.
  • IdentityClaimTypeAppService (implementa IIdentityClaimTypeAppService): Implementa os casos de uso da interface do usuário de gerenciamento de tipos de reivindicação.
  • IdentitySettingsAppService (implementa IIdentitySettingsAppService): Usado para obter e atualizar configurações para o módulo de identidade.
  • IdentityUserLookupAppService (implementa IIdentityUserLookupAppService): Usado para obter informações de um usuário por id ou userName. É destinado a ser usado internamente pelo framework ABP.
  • ProfileAppService (implementa IProfileAppService): Usado para alterar o perfil de um usuário e a senha.
  • IdentitySecurityLogAppService (implementa IIdentitySecurityLogAppService): Implementa os casos de uso da interface do usuário de logs de segurança.
  • OrganizationUnitAppService (implementa OrganizationUnitAppService): Implementa os casos de uso da interface do usuário de gerenciamento de unidades organizacionais.

Provedores de Banco de Dados

Este módulo fornece opções de Entity Framework Core e MongoDB para o banco de dados.

Entity Framework Core

O pacote NuGet Volo.Abp.Identity.EntityFrameworkCore implementa a integração do EF Core.

Tabelas do Banco de Dados
  • AbpRoles
    • AbpRoleClaims
  • AbpUsers
    • AbpUserClaims
    • AbpUserLogins
    • AbpUserRoles
    • AbpUserTokens
  • AbpClaimTypes
  • AbpOrganizationUnits
    • AbpOrganizationUnitRoles
    • AbpUserOrganizationUnits
  • AbpSecurityLogs

MongoDB

O pacote NuGet Volo.Abp.Identity.MongoDB implementa a integração do MongoDB.

Coleções do Banco de Dados
  • AbpRoles
  • AbpUsers
  • AbpClaimTypes
  • AbpOrganizationUnits
  • AbpSecurityLogs

Propriedades Comuns do Banco de Dados

Você pode definir as seguintes propriedades da classe AbpIdentityDbProperties para alterar as opções do banco de dados:

  • DbTablePrefix (Abp por padrão) é o prefixo para os nomes das tabelas/coleções.
  • DbSchema (null por padrão) é o esquema do banco de dados.
  • ConnectionStringName (AbpIdentity por padrão) é o nome da string de conexão para este módulo.

Essas são propriedades estáticas. Se você quiser definir, faça isso no início de sua aplicação (normalmente, em Program.cs).