Comment intégrer l’authentification par fédération dans un projet MVC (Partie 2)

Après la mise en place de la configuration de la fédération (Partie 1), Nous allons voir dans ce chapitre comment récupérer et ajouter des claims avec le code C#.

 1.Récupération des claims

Après l’authentification le serveur renvoie à l’application les informations de l’utilisateur connecté (Claims). Ces informations seront utilisées par l’application pour identifier l’utilisateur courant.

Comment faire pour récupérer les claims ?

Exemple de code :

var identity = (ClaimsIdentity)System.Threading.Thread.CurrentPrincipal.Identity;
string name = identity.Claims.Where(c => c.ClaimType == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name").Select(c => c.Value).FirstOrDefault();

Chaque claim est représenté par le couple Type (contient l’url d’identification du claim) et valeur.

2.Ajouter les rôles pour l’utilisateur connecté

Si vous souhaitez ajouter des restrictions sur des actions de votre application MVC, il faut ajouter le mot clé Authorize avant la signature de l’action.

Ce mot clé permet de vérifier si l’utilisateur est bien authentifié (Identity.IsAuthenticated = true). Sinon l’utilisateur n’aura pas accès à cette action.

Exemple :

[Authorize]

public ActionResult Index()

{

/* do some code*/

}

Cependant, il y a des actions qui nécessitent parfois des rôles bien précis (Admin, …), ces rôles sont stockés dans les claims de l’utilisateur connecté.

Exemple:

[Authorize(Roles = "ADMIN")]

public ActionResult Index()

{

/* do some code*/

}

Ajouter des nouveaux rôles pour l’utilisateur

Il est possible d’ajouter des nouveaux rôles pour l’utilisateur connecté après l’authentification. Ils seront stockés dans des claims de type ClaimTypes.Role. Ajouter la méthode Application_PostAuthenticateRequest  Dans le fichier Global.asax.cs.

  protected    void Application_PostAuthenticateRequest(object sender, EventArgs e)
    {
		var identity = (ClaimsIdentity)System.Threading.Thread.CurrentPrincipal.Identity;
		if (identity != null && identity.IsAuthenticated 
        {
			 var username = identity.Claims.Where(c => c.ClaimType == "LOGIN").Select(c => c.Value).FirstOrDefault(); /*Claim Login*/
			 var roles = GetRolesForUser(username) /*Permet de récupérer les rôles de l'utilisateur*/
			 foreach (var role in roles)
             {
				if (!identity.Claims.ToList().Any(c => c.ClaimType == ClaimTypes.Role && c.Value == role))
                {
                    identity.Claims.Add(new Claim(ClaimTypes.Role, role));
                }
             }
			 
		}
		
	} 

3.Déconnexion

La méthode de déconnexion supprime la session de l’utilisateur connecté, ainsi que le cookie d’authentification généré par la FED. Une fois que l’utilisateur est déconnecté, il n’aura plus accès à l’ensemble des applications qui utilisent le même token.

Exemple de code pour se déconnecter :

public void SignOut()
    {
           WSFederationAuthenticationModule.FederatedSignOut(
                    new Uri(config.WsFederationConfiguration.Issuer),
                    new Uri(Url.Action("Index", "Index", null, Request.Url.Scheme)));
    }

Et voilà, à vous de jouer, j'espère que cet article vous aura aider.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *