ASP .NET Core - Usando o ASP .NET Core Identity - I


Neste artigo vou mostrar como usar ASP .NET Core Identity e a autenticação baseada em Claims e como implementá-la em uma aplicação ASP .NET Core 2.0.

A ASP.NET Core Identity é o novo sistema de associação ou membership que acompnha o .NET Core e que usa o recurso da autenticação baseada em reivindicações ou claims. Ela inclui suporte a perfil, integração OAuth, trabalha com Owin, e está incluído com os modelos ASP.NET no Visual Studio 2017.

Dentre as características do ASP .NET Identity podemos destacar:

 

Antes de iniciar a exploração da ASP .NET Identity vamos comprender o que é a autenticação baseada em Claims ou declarações.

Autenticação baseda em Claims

Vamos considerar um cenário em que uma pessoa chamada José, que é estudante universitário, vai a um banco para abrir uma conta. O gerente do banco quer ver algum tipo de documento que comprove a identidade de José, e, José apresenta a sua carteira de motorista, que tem seu Nome, Data de Nascimento e Endereço.

José também quer candidatar-se ao desconto que o banco oferece apenas aos estudantes. O gerente novamente pede algum documento que comprove que José é um estudante. Desta vez José apresenta sua carteira de estudante que tem o nome, o nome da universidade, o nome do curso e o número do estudante.

Este cenário da vida real pode ser usado como uma analogia para explicar a autenticação baseada em declarações ou claims. Aqui José é o Usuário que está usando a autenticação baseada em Claims. Ele está usando duas identidades (um usuário pode ter várias identidades) - carteira de motorista e carteira de estudante.

Assim uma identity ou  identidade possui declarações anexadas a ela como :  Nome, Data de nascimento, Número de Estudante, Curso, etc.


A implementação da ASP .NET Core Identity

Na implementação atual da ASP.NET Core, um usuário é do tipo ClaimsPrincipal que implementa a interface IPrincipal. A classe ClaimsPrincipal é implementada no namespace System.Security.Claims.

Como a ASP .NET Core é open-source podemos espiar o código fonte da ASP .NET Identity no repositório GitHubhttps://github.com/aspnet/identity

public class ClaimsPrincipal : IPrincipal
{
	...........
	...........
    public virtual IIdentity Identity { get; }
    public virtual IEnumerable<ClaimsIdentity> Identities { get; }
    public virtual IEnumerable<Claim> Claims { get; }
	...........
	...........
    public virtual bool HasClaim(Predicate<Claim> match);
    public virtual bool HasClaim(string type, string value);
    public virtual bool IsInRole(string role);
	...........
	...........
}

Podemos notar que a classe ClaimsPrincipal possui uma propriedade Identities que retorna a coleção de ClaimsIdentity. Isso significa que um Usuário pode ter múltiplas identidades.

Existe outra propriedade Identity que retorna a identidade das claims primárias associadas a esta claims principal.

Outra propriedade importante é Claims que retorna uma coleção que contém todas as claims de todas as identidades de claims associadas a esta claims principal.

Vejamos agora o código da classe ClaimsIdentity :

public class ClaimsIdentity : IIdentity
{
    ........... 
    ........... 
    public virtual string AuthenticationType { get; }
    public virtual string Name { get; }
    public virtual bool IsAuthenticated { get; }
    public virtual IEnumerable<Claim> Claims { get; }
    public virtual IEnumerable<Claim> FindAll(Predicate<Claim> match)
    public virtual Claim FindFirst(string type);
    public virtual bool HasClaim(string type, string value);
    ........... 
    ........... 
}

A propriedade AuthenticationType retorna o tipo que poderia ser algo como Basic, Windows, Cookie, etc.

A propriedade Claims retorna a coleção de claims associadas a essa identidade.

Então, agora, se tentarmos mapear o exemplo do universitário José relacionando-o com essas classes, podemos chegar a algo parecido com isso:

Interagindo com a ASP .NET Core Identity

A ASP.NET Core Identity implementou algumas APIs (SignInManager, UserManager, RoleManager, etc.) que simplifica as interações com os objetos de identidade.

Ao trabalhar em um projeto ASP .NET Core a injeção de dependência nativa vai fornecer os objetos para essas classes de forma que possamos usá-las.

Por exemplo, a classe SignInManager implementa o seguinte método público para se logar ou inscrever um usuário:

public virtual async Task SignInAsync(TUser user, AuthenticationProperties authenticationProperties, 
string authenticationMethod = null)
{
	var userPrincipal = await CreateUserPrincipalAsync(user);
	if (authenticationMethod != null)
	{
  	  userPrincipal.Identities.First().AddClaim(new Claim(ClaimTypes.AuthenticationMethod, 
authenticationMethod));
	}
	await Context.SignInAsync(IdentityConstants.ApplicationScheme, userPrincipal,authenticationProperties
 ?? new AuthenticationProperties());
}

Esta foi apenas uma apresentação do recurso, no próximo artigo vamos iniciar a criação de um projeto ASP .NET Core vazio e incluir diferentes funcionalidades como Login, Logout, geração de Token, etc.

"Mas nós não recebemos o espírito do mundo, mas o Espírito que provém de Deus, para que pudéssemos conhecer o que nos é dado gratuitamente por Deus. "
1 Coríntios 2:12

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti