VAGAS DE EMPREGO

balta.io balta.io
  • Cursos
  • Carreiras
  • Para sua Empresa
  • Livros
    • Background Services
    • Blazor com .NET 8
    • Segurança em APIs
    • Futuro do C# 12
    • Nullable Types
    • Clean Code
  • Blog

Seja Premium
balta.io

  • Cursos
  • Carreiras
  • Para sua Empresa
  • Agenda
  • Livros
    • Background Services
    • Blazor com .NET 8
    • Segurança em APIs
    • Futuro do C# 12
    • Nullable Types
    • Clean Code
  • Blog
  • Player
Seja Premium

Entre ou Cadastre-se

  • Home
  • Artigos
  • Cutomizando Claims no ASP.NET


👉 Temos uma versão mais atualizada deste artigo no nosso novo Blog

Cutomizando Claims no ASP.NET

Neste artigo vamos aprender a armazenar Claims customizados e fazer a leitura deles posteriormente no ASP.NET.

O que são Claims?

A tradução da palavra Claim é afirmação e podemos dizer que no .NET, um Claim nada mais é do que uma composição de chave/valor que afirma algo.

Dada esta composição, podemos tomar ações de autorização em nossa aplicações ou APIs, da forma que desejarmos.

Claims padrões

O .NET também traz alguns Claims padrões, dentro do enumerador ClaimTypes que nos fornece dentre outros o [ClaimTypes.Name](http://ClaimTypes.Name) que serve como base para obter o nome do usuário.

new Claim(ClaimTypes.Name, "xyz@balta.io")

ClaimTypes.Name e ClaimTypes.Role

Existem dois Claims em específico que são extremamente úteis no ciclo de vida de qualquer aplicação ASP.NET ou Blazor, e eles são o ClaimTypes.Name e ClaimTypes.Role.

Sempre que atribuímos o ClaimTypes.Name temos acesso instantâneo a ele através do User.Identity.Name.

...
new Claim(ClaimTypes.Name, "andré");
...

public IActionResult GetAsync()
{
	var name = User.Identity.Name; // andré
}

O mesmo vale para o ClaimTypes.Role que podemos atribuir várias vezes e posteriormente verificar através do User.IsInRole ou pelo atributo Authorize.

...
new Claim(ClaimTypes.Role, "student");
new Claim(ClaimTypes.Role, "premium");
...

[Authorize(Roles = "student")]
public IActionResult GetAsync()
{
	if(User.IsInRole("premium"))
		...
}

Como criar Claims Customizados

Mas você sabia que podemos criar Claims customizados? Que não estão definidos no enumerador ClaimTypes?

Dado que um Claim é apenas uma composição de Chave/Valor, podemos utilizar qualquer literal para sua chave. Na verdade o ClaimTypes é apenas um atalho para isto, que previne o uso de uma literal inválida.

Se analisarmos o código que gera os Claims mostrado no artigo anterior, teremos o seguinte:

private static ClaimsIdentity GenerateClaims(User user)
{
    var ci = new ClaimsIdentity();
    ci.AddClaim(new Claim(ClaimTypes.Name, user.Email));
    foreach (var role in user.Roles)
        ci.AddClaim(new Claim(ClaimTypes.Role, role));

    return ci;
}

Podemos modificar este código para adicionar qualquer Claim customizado, como desejarmos, no caso, para ser bem explícito, vamos utilizar o Claim abaixo.

private static ClaimsIdentity GenerateClaims(User user)
{
    var ci = new ClaimsIdentity();
    ci.AddClaim(new Claim(ClaimTypes.Name, user.Email));
    foreach (var role in user.Roles)
        ci.AddClaim(new Claim(ClaimTypes.Role, role));

		ci.AddClaim("fruit", "banana"); // 👈

    return ci;
}

IMPORTANTE Este Claim também será adicionado ao PayLoad do Token caso esteja trabalhando com APIs ou nos Cookies caso esteja trabalhando com ASP.NET. Então, nada de informação sensível aqui.

Como ler Claims Customizados

Com o Claim adicionado, agora precisamos obter esta informação, e isto pode ser feito através do objeto User.Claims, que contém todos os Claims do contexto atual.

User.Claims.FirstOrDefault(x => x.Type == "fruit"); // banana

Pronto, agora você tem tanto a criação como leitura de Claims customizados e pode utilizá-los para armazenar mais informações além do nome do usuário.

Extension Methods

Aproveitando a oportunidade, este é um ótimo cenário para se criar um Extension Method, que retorna os Claims que você precisa.

Assim você evita possíveis erros, já que o Claim pode não existir ou o valor dele, por ser uma string, pode não ser convertido para o tipo esperado.

Abaixo está um exemplo que utilizo, onde tenho extensões para ler o Id, Nome e E-mail do usuário, três Claims que sempre utilizo nas minhas aplicações.

public static class ClaimsPrincipalExtension
{
    public static Guid Id(this ClaimsPrincipal user)
    {
        try
        {
            var id = new Guid(user.Claims.FirstOrDefault(c => c.Type == "Id")?.Value ?? string.Empty);
            return id;
        }
        catch
        {
            return Guid.Empty;
        }
    }

    public static string Name(this ClaimsPrincipal user)
    {
        try
        {
            return user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value ?? string.Empty;
        }
        catch
        {
            return string.Empty;
        }
    }

    public static string Email(this ClaimsPrincipal user)
    {
        try
        {
            return user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value ?? string.Empty;
        }
        catch
        {
            return string.Empty;
        }
    }
}

Para utilizar basta importar o namespace onde criou sua extensão, no caso eu já faço isto utilizando o Global Using para não haver a necessidade de importar este namespace em todos os arquivos que precisarei dele.

global using Balta.Ui.Web.Extensions;

E assim utilizar a extensão, que funciona tanto para APIs, MVC, Minimal APIs e até Blazor.

// Razor
@User.Id()
@User.Name()
@User.Email()

// MVC
User.Id()
User.Name()
User.Email()

// Minimal APIs
user.Id()
user.Name()
user.Email()

Conclusão

Trabalhar com Claims customizados no ASP.NET e Blazor é uma tarefa relativamente simples e com ajuda do C# tornamos nossa vida ainda mais fácil.

Populares

Priority Queue

Priority Queue ou fila prioritária é um tipo de lista inclusa no C# 10 que permite que seus itens...


Implicit Operators no C#

Implicit Operators permitem adicionar comportamentos de conversão a objetos Built In ou complexos...


ASP.NET 5 – Autenticação e Autorização com Bearer e JWT

Este artigo atualmente utiliza a versão 5.0.0-rc.1 do ASP.NET/.NET, o que significa que ainda não...


Clean Code - Guia e Exemplos

Saiba como manter seu código limpo (Clean Code) seguindo algumas práticas sugeridas pelo Robert C...


Git e GitHub - Instalação, Configuração e Primeiros Passos

Git é um sistema de controle de versões distribuídas, enquanto GitHub é uma plataforma que tem o ...


Compartilhe este artigo



Conheça o autor

André Baltieri

André Baltieri

Microsoft MVP

Me dedico ao desenvolvimento de software desde 2003, sendo minha maior especialidade o Desenvolvimento Web. Durante esta jornada pude trabalhar presencialmente aqui no Brasil e Estados Unidos, atender remotamente times da ?ndia, Inglaterra e Holanda, receber 8x Microsoft MVP e realizar diversas consultorias em empresas e projetos de todos os tamanhos.





3.133

Aulas disponíveis

292

horas de conteúdo

76.461

Alunos matriculados

53.012

Certificados emitidos





Comece de graça agora mesmo!

Temos mais de 21 cursos totalmente de graça e todos com certificado de conclusão.

Começar


Prefere algo mais Premium?

Conheça nossos planos



Premium anual

Compra única, parcelada em até
12x no cartão de crédito


12x R$

99

,79

=R$ 1.197,44
  • 1 ano de acesso
  • Acesso à todo conteúdo
  • Emissão de Certificado
  • Tira Dúvidas Online
  • 67 cursos disponíveis
  • 10 carreiras disponíveis
  • 161 temas de tecnologia
  • Conteúdo novo todo mês
  • Encontros Premium

Começar agora

Política de privacidade



Precisa de ajuda?

Dúvidas frequentes



  • Posso começar de graça?

    Sim! Basta criar sua conta gratuita no balta.io e começar seus estudos. Nós contamos com diversos cursos TOTALMENTE gratuitos e com certificado de conclusão.

  • Vou ter que pagar algo?

    Nós temos cursos gratuitos e pagos, porém você não precisa informar nenhum dado de pagamento para começar seus estudos gratuitamente conosco. Os cursos gratuitos são completos e com certificado de conclusão, você não paga nada por eles.

    Porém, caso queira algo mais Premium , você terá acesso à diversos benefícios que vão te ajudar ainda mais em sua carreira.

  • Por onde devo começar?

    Siga SEMPRE as nossas Carreiras , elas vão te orientar em todos os sentidos. Os cursos já estão organizados em categorias e carreiras para facilitar seu aprendizado.
    Nossa sugestão para aprendizado é começar pelo Backend e seguindo para Frontend e Mobile.

    • Backend
    • Frontend
    • Mobile

  • Os cursos ensinam tudo que preciso?

    Nenhum curso no mundo vai te ensinar tudo, desculpa ser sincero! Os cursos são uma base, eles fornecem por volta de 30% do que você precisa aprender, o resto é com você, com dedicação e MUITA prática.

  • O que eu devo estudar?

    Java ou .NET? Angular ou React? Xamarin ou Flutter? A resposta é simples e direta: "Você já sabe o básico?"

    Se você ainda não sabe BEM o básico, ou seja, os fundamentos, OOP, SOLID, Clean Code, está perdendo tempo estudando Frameworks ou até coisas mais avançadas como Docker. Foque nos seus objetivos primeiro.
    Agora se você está indeciso sobre qual Framework estudar, a boa notícia é que o mercado neste momento está bem aquecido e você tem várias oportunidade. Desta forma o que levaríamos em conta para tomar esta decisão seria:

    • Já sei o básico
    • O Framework/Tecnologia tem mercado onde eu estou (região)
    • O Framework/Tecnologia é utilizado em uma empresa onde quero atual
    • O Framework/Tecnologia resolve meu problema
    • Eu gosto de utilizar o Framework/Tecnologia

  • Estou pronto para estudar no balta.io?

    Com certeza! O primeiro passo é começar e você pode fazer isto agora mesmo!

    Começar de graça

Ainda tem dúvidas?





Assine nosso Newsletter

Receba em primeira mão todas as nossas novidades.

Cadastrar


balta.io

Sobre

  • Como funciona?
  • Seja Premium
  • Agenda
  • Blog
  • Todos os cursos

Cursos

  • Frontend
  • Backend
  • Mobile
  • Fullstack

Suporte

  • Termos de uso
  • Privacidade
  • Cancelamento
  • Central de ajuda

Redes Sociais

  • Telegram
  • Facebook
  • Instagram
  • YouTube
  • Twitch
  • LinkedIn
  • Discord