Aller au contenu principal

18-3 Extension Identity (IIdentity)

Le principe fonctionne, mais faire appel à @User.FindFirstValue(ClaimTypes.GivenName) est moins élégant qu'utiliser @User.Identity.IsAuthenticated ou @User.Identity.Name par exemple.

Pour nous aider, on peut créer une extension qui ajoutera des fonctions à l'objet Identity!

  1. Créer dossier Extensions. Sous le projet Web.Mvc, ajoutez un dossier appelé Extensions.
  2. Créer la classe IdentityExtensions. Sous le dossier nouvellement créé, ajoutez une classe IdentityExtensions.
  3. Classe static. Comme on créera une extension pour IIdentity, la classe doit être static
    Snowfall.Web.Mvc/Extensions/IdentityExtensions.cs
    public static class IdentityExtensions
    {

    }
  4. Code de base pour Prenom. Ajoutez le code suivant pour retourner le prénom:
    Snowfall.Web.Mvc/Extensions/IdentityExtensions.cs
    public static class IdentityExtensions
    {
    public static string Prenom(this IIdentity identity)
    {
    return identity.FindFirstValue(ClaimTypes.GivenName);
    }

    public static string FindFirstValue(this IIdentity identity, string claimType)
    {
    var claim = ((ClaimsIdentity)identity).FindFirst(claimType)?.Value;
    return claim ?? string.Empty;
    }
    }
info
  • public static string Prenom(this IIdentity identity): la référence à this IIdentity indique qu'on crée une extension pour le type IIdentity (une fonction supplémentaire disponible sur les instances de ce type)
  • return identity.FindFirstValue(ClaimTypes.GivenName);: on retourne simplement le claim correspondant au type GivenName.
  • public static string FindFirstValue(this IIdentity identity, string claimType) cette fonction est simplement une fonction d'aide pour obtenir l'information. Comme nous aurons plusieurs propriétés à obtenir, cela réduira la duplication de code.

Utiliser l'extension dans _Layout

On peut maintenant utiliser l'extension dans _Layout pour afficher le prénom.

Snowfall.Web.Mvc/Views/Shared/_Layout.cshtml
@if (User.Identity != null && User.Identity.IsAuthenticated)
{
<span class="navbar-text">Bonjour, @User.Identity.Prenom()!</span>
}
info

On peut maintenant simplement utiliser @User.Identity.Prenom(). Beaucoup mieux!

Compléter la classe d'extension avec les autres attributs

Finalement, ajoutons les différentes méthodes associées aux Claims de l'utilisateur dans la classe d'extension.

Ils ne seront pas tous utilisés dès maintenant, mais seront très pratiques lorsque nous en aurons besoin. Particulièrement Id().

public static class IdentityExtensions
{
public static string Prenom(this IIdentity identity)
{
return identity.FindFirstValue(ClaimTypes.GivenName);
}

public static string Nom(this IIdentity identity)
{
return identity.FindFirstValue(ClaimTypes.Surname);
}

public static string Id(this IIdentity identity)
{
return identity.FindFirstValue(ClaimTypes.NameIdentifier);
}

public static string NomComplet(this IIdentity identity)
{
return identity.FindFirstValue("NomComplet");
}

public static string FindFirstValue(this IIdentity identity, string claimType)
{
var claim = ((ClaimsIdentity)identity).FindFirst(claimType)?.Value;
return claim ?? string.Empty;
}
}

level up