Vous êtes sur la page 1sur 39

ASP.

NET MVC : gestion d’utilisateurs

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 33


Plan

1 Introduction

2 Le modèle

3 Le contrôleur

4 Les vues

5 Le fichier Web.config

6 Tester

7 Les Rôles

H & H: Research and Training 2 / 33


Introduction

Gestion d’utilisateurs

Objectif H I ©
U EL
Créer un système d’authentification O
f E LM
ch r e
Sécuriser l’accès à notre application web

©A

H & H: Research and Training 3 / 33


Introduction

Gestion d’utilisateurs

Étape

H I ©
Utiliser l’entité Personne pour la gestion des utilisateurs
UEL
O
Créer les formulaires et les contrôleurs qui vont permettre à un
E LM
utilisateur de s’authentifier ou de s’inscrire s’il n’a pas de compte
f
utilisateur valide
ch r e
©A
Interdire l’accès à certaines ressources pour les utilisateurs non
authentifiés

H & H: Research and Training 4 / 33


Introduction

Gestion d’utilisateurs

H I ©
EL
Avant de commencer

O U
Créer un nouveau projet ASP.NET AspNetSecurity

f E LM
ch r e
Créer un contrôleur MVC vide HomeController

©A

H & H: Research and Training 5 / 33


Introduction

Gestion d’utilisateurs
Contenu de HomeController
namespace AspNetSecurity.Controllers
{
public class HomeController : Controller
{
H I ©
EL
// GET: Home
public ActionResult Index()
O U
LM
{

}
return View();
r e f E
ch
©A
public ActionResult Both()
{
return View();
}
}
}

H & H: Research and Training 6 / 33


Introduction

Gestion d’utilisateurs
Contenu de la vue Index.cshtml définie dans /Views/Home
@{
Layout = null;
}
<!DOCTYPE html>
H I ©
EL
<html>
<head>
O U
LM
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
r e f E
ch
©A
<body>
<div>
Page pour les utilisateurs ayant les rôles Admin
ou User
</div>
</body>
</html>

H & H: Research and Training 7 / 33


Introduction

Gestion d’utilisateurs
Contenu de la vue Both.cshtml définie dans /Views/Home
@{
Layout = null;
}
<!DOCTYPE html>
H I ©
EL
<html>
<head>
O U
LM
<meta name="viewport" content="width=device-width" />
<title>Both</title>
</head>
r e f E
ch
©A
<body>
<div>
Page pour les utilisateurs ayant les rôles Admin
et User
</div>
</body>
</html>

H & H: Research and Training 8 / 33


Le modèle

Gestion d’utilisateurs

H I ©
Objectif
UEL
O
f E LM
Sécuriser l’accès au contrôleur HomeController et ses vues en
fonctions des rôles attribués aux utilisateurs.
ch r e
©A

H & H: Research and Training 9 / 33


Le modèle

Gestion d’utilisateurs
Commençons par créer l’entité Personne suivante

namespace AspNetSecurity.Models
{
public class Personne
{
[Key]

H I
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]©
public int Num { get; set; }
public string Nom { get; set; }
UEL
O
LM
[Required]

r e E
public string Prenom { get; set; }
f
public bool Sportif { get; set; }
[Required]
ch
©A
public string Password { get; set; }
}
}

H & H: Research and Training 10 / 33


Le modèle

Gestion d’utilisateurs
Commençons par créer l’entité Personne suivante

namespace AspNetSecurity.Models
{
public class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
H I ©
public int Num { get; set; }
public string Nom { get; set; }
U EL
O
LM
[Required]

r e E
public string Prenom { get; set; }
f
public bool Sportif { get; set; }
[Required]
ch
©A
public string Password { get; set; }
}
}

Pour les décorateurs, il faut utiliser les espaces de noms suivants :

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

H & H: Research and Training 10 / 33


Le modèle

Gestion d’utilisateurs

N’oublions pas de
H I ©
UEL
O
Préparer le contexte (clic droit sur le projet et aller Ajouter >

E LM
Nouvel élément > Données > ADO.NET Entity Data Model
f
> Modèle vide Code First)
ch r e
©A

H & H: Research and Training 11 / 33


Le modèle

Gestion d’utilisateurs
Mettons à jour le contexte (la classe Model1)
public class Model1 : DbContext
{
public Model1()
H I ©
EL
: base("name=Model1")
{
O U
}
f E LM
public virtual DbSet<Personne> Personnes { get;
set; }
ch r e
} ©A

H & H: Research and Training 12 / 33


Le modèle

Gestion d’utilisateurs
Mettons à jour le contexte (la classe Model1)
public class Model1 : DbContext
{
public Model1()
H I ©
EL
: base("name=Model1")
{
O U
}
f E LM
public virtual DbSet<Personne> Personnes { get;
set; }
ch r e
} ©A
N’oublions pas
using AspNetSecurity.Models;

H & H: Research and Training 12 / 33


Le contrôleur

Gestion d’utilisateurs

I ©
Ensuite créons un contrôleur contenant les actions suivantes
H
Une pour la connexion
UEL
O
Une pour l’inscription
f E LM
ch r e
Une pour la déconnexion
© A

H & H: Research and Training 13 / 33


Le contrôleur

Gestion d’utilisateurs
HttpContext.User : les données sur l’utilisateur
HttpContext.User.Identity.Name : retourne le nom de
l’utilisateur (personne) connecté
HttpContext.User.Identity.IsAuthenticated : retourne
H I ©
true si la personne s’est authentifiée
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 14 / 33


Le contrôleur

Gestion d’utilisateurs
HttpContext.User : les données sur l’utilisateur
HttpContext.User.Identity.Name : retourne le nom de
l’utilisateur (personne) connecté

I ©
HttpContext.User.Identity.IsAuthenticated : retourne
H
true si la personne s’est authentifiée EL
M OU
Pour enregistrer la personnef E L ée
authentifi
chr e
A
FormsAuthentication.SetAuthCookie(chaı̂ne,bool)
permet ©de créer un cookie contenant chaı̂ne. Si bool est à
:

false, alors l’authentification n’aura qu’une durée de vie limitée à


la session.
FormsAuthentication.SignOut() : permet de détruire le
cookie de l’authentification
H & H: Research and Training 14 / 33
Le contrôleur

Gestion d’utilisateurs
Le contrôleur LoginController : partie connexion (1) GET

public ActionResult Index()


{
var Authentifie = HttpContext.User.Identity.IsAuthenticated;
ViewData["Authentifie"] = Authentifie;
Personne personne = null;
H I ©
if (Authentifie)
UEL
{
O
using (var db = new Model1())
f E LM
{

ch r e
personne = (from p in db.Personnes

©A
where p.Nom == HttpContext.User.Identity.
Name
select p).FirstOrDefault();
}
}
return View(personne);
}

H & H: Research and Training 15 / 33


Le contrôleur

Le contrôleur LoginController : partie connexion (1) POST


[HttpPost]
public ActionResult Index(Personne personne, string returnUrl) {
Personne perso = null;
var Authentifie = HttpContext.User.Identity.IsAuthenticated;
ViewData["Authentifie"] = Authentifie;
if (ModelState.IsValid) {
using (var db = new Model1())
{
perso = (from p in db.Personnes
H I ©
EL
where p.Prenom.Equals(personne.Prenom) && p.Password.
U
Equals(personne.Password)
O
LM
select p).FirstOrDefault();
if (perso != null) {

r e f E
FormsAuthentication.SetAuthCookie(perso.Nom.ToString(),false);

ch
Authentifie = HttpContext.User.Identity.IsAuthenticated;

©A
if (!string.IsNullOrWhiteSpace(returnUrl) && Url.IsLocalUrl(
returnUrl))
return Redirect(returnUrl);
return Redirect("/");
}
}
}
return View(personne);
}

H & H: Research and Training 16 / 33


Le contrôleur

Gestion d’utilisateurs
Le contrôleur LoginController : deuxième partie inscription
public ActionResult Inscription()
{
return View();
}
[HttpPost]
H I ©
EL
public ActionResult Inscription(Personne personne)
{
O U
LM
if (ModelState.IsValid)
{

r e f E
using (var db = new Model1())
{
ch
©A db.Personnes.Add(personne);
db.SaveChanges();
}
FormsAuthentication.SetAuthCookie(personne.Nom.ToString(),
false);
return Redirect("/");
}
return View(personne);
}
H & H: Research and Training 17 / 33
Le contrôleur

Gestion d’utilisateurs

Le contrôleur LoginController : troisième partie déconnexion


H I ©
public ActionResult Deconnexion()
UEL
{
O
FormsAuthentication.SignOut();
f E LM
return Redirect("/");
ch r e
©A
}

H & H: Research and Training 18 / 33


Les vues

La vue d’authentification Index


@{ bool test = (bool)@ViewData["Authentifie"]; }
@if (test)
{
<h3> Utilisateur déjà connecté avec le login @Model.Prenom </h3>
@Html.ActionLink("Cliquer pour vous déconnecter ?", "Deconnexion")
}
else
{
<h3>Connexion :</h3>
H I ©
using (Html.BeginForm())
UEL
{
O
LM
<div>
@Html.LabelFor(m => m.Prenom)

r e f
@Html.TextBoxFor(m => m.Prenom) E
ch
@Html.ValidationMessageFor(m => m.Prenom)
</div>
<div> ©A
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<input type="submit" value="Connexion" /><br />
@Html.ActionLink("Inscription", "Inscription")
}
}
H & H: Research and Training 19 / 33
Les vues

Gestion d’utilisateurs
La vue d’inscription Inscription
<h3>Inscription </h3>
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Prenom)
@Html.TextBoxFor(m => m.Prenom)
H I ©
EL
@Html.ValidationMessageFor(m => m.Prenom)
U
</div>
O
LM
<div>

r e E
@Html.LabelFor(m => m.Nom)
f
@Html.TextBoxFor(m => m.Nom)

ch
@Html.ValidationMessageFor(m => m.Nom)
</div>
<div> ©A
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<input type="submit" value="Inscription" />
}

H & H: Research and Training 20 / 33


Le fichier Web.config

Gestion d’utilisateurs

Ajouter le code suivant dans la section


<system.web>...</system.web> dans Web.config (à ne pas
H I ©
U
confondre avec web.config de Views) EL
M O
f E L
<authentication mode="Forms">

c h r e
<forms loginUrl="˜/Login/Index" />

©A
</authentication>

H & H: Research and Training 21 / 33


Tester

Gestion d’utilisateurs
Pour tester, utiliser les décorateurs suivants :
[Authorize] : indique que la ressource (action, contrôleur) n’est
accessible qu’après authentification

I
[AllowAnonymous] : rend une action, d’un contrôleur
H ©
EL
accessible seulement après authentification, accessible sans
U
O
LM
authentification.

r e f E
ch
©A

H & H: Research and Training 22 / 33


Tester

Gestion d’utilisateurs
Pour tester, utiliser les décorateurs suivants :
[Authorize] : indique que la ressource (action, contrôleur) n’est
accessible qu’après authentification

I
[AllowAnonymous] : rend une action, d’un contrôleur
H ©
EL
accessible seulement après authentification, accessible sans
U
O
LM
authentification.

r e f E
ch
©A
On peut aussi autoriser l’accès à une ressource à certains utilisateurs

utilisation de rôles : attribuer un ou plusieurs rôles pour chaque


utilisateur
Définir les rôles autorisés d’accès à une ressource :
[Authorize(Roles = "Admin")]

H & H: Research and Training 22 / 33


Les Rôles

Gestion d’utilisateurs

Créons une entité Role


public class Role
{
H I ©
[Key]
UEL
O
LM
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
r e f E
ch
©A
public string Title { get; set; }
public virtual List<Personne> Personnes { get; set; }
}

H & H: Research and Training 23 / 33


Les Rôles

Gestion d’utilisateurs

Modifions l’entité Personne


public class Personne
{
[Key]
H I ©
EL
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
U
public int Num { get; set; }
O
public string Nom { get; set; }
[Required]
f E LM
ch r e
public string Prenom { get; set; }

©A
public bool Sportif { get; set; }
[Required]
public string Password { get; set; }
public virtual List<Role> Roles { get; set; }
}

H & H: Research and Training 24 / 33


Les Rôles

Gestion d’utilisateurs

N’oublions pas de

Mettre à jour la classe contexte Model1

I ©
Régénérer la base de données (faire la migration)
H
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 25 / 33


Les Rôles

Gestion d’utilisateurs

N’oublions pas de

Mettre à jour la classe contexte Model1

I ©
Régénérer la base de données (faire la migration)
H
EL
M OU
f E Là exécuter dans la Console du
Les commandes pour la migration
Gestionnaire de h r e
c package
© A
Enable-Migrations
Add-Migration add tables role and personnerole
Update-database

H & H: Research and Training 25 / 33


Les Rôles

Gestion d’utilisateurs

Préparons notre fournisseur de rôles : créons une classe


CustomRoleProvider dans Configurations qui implémente
RoleProvider
H I ©
EL
public class CustomRoleProvider : RoleProvider
U
{ O
f E LM
}
ch r e
©A
Plusieurs méthodes à implémenter : celles qui nous intéressent
GetAllRoles, GetRolesForUser et IsUserInRole

H & H: Research and Training 26 / 33


Les Rôles

Gestion d’utilisateurs

Implémentons la méthode GetAllRoles


public override string[] GetAllRoles()
H I ©
{
UEL
using (var db = new Model1()) O
{
f E LM
ch r e
return db.Roles.Select(r => r.Title).ToArray();

©A
}
}

H & H: Research and Training 27 / 33


Les Rôles

Gestion d’utilisateurs

Implémentons la méthode GetRolesForUser


public override string[] GetRolesForUser(string nom)
{
using (var db = new Model1())
H I ©
EL
{

O
var personne = db.Personnes.SingleOrDefault(uU
=> u.Nom == nom);
f E LM
if (personne == null)
ch
return new string[] { };r e
} :
©A
return personne.Roles == null ? new string[] {
personne.Roles.Select(u => u.Title).
ToArray();
}
}

H & H: Research and Training 28 / 33


Les Rôles

Gestion d’utilisateurs
Implémentons la méthode IsUserInRole
public override bool IsUserInRole(string nom, string
title)
{
using (var db = new Model1())
{
H I ©
UEL
var personne = db.Personnes.SingleOrDefault(u => u.
O
LM
Nom == nom);
if (personne == null)
return false;
r e f E
ch
©A
var role = (from r in db.Roles
where r.Title.Equals(title) && r.
Personnes.Any(u => u.Nom == nom)
select r).First();
return role != null;
}
}

H & H: Research and Training 29 / 33


Les Rôles

Gestion d’utilisateurs

Déclarons le provider dans Web.config (à ne pas confondre avec web.config de Views)
dans la section <system.web>

<system.web>
...
H I ©
EL
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
U
<providers>
O
LM
<clear/>

r e E
<add name="CustomRoleProvider" type="AspNetSecurity.
f
Configurations.CustomRoleProvider"/>
</providers>
ch
</roleManager>
©A

H & H: Research and Training 30 / 33


Les Rôles

Gestion d’utilisateurs

Déclarons le provider dans Web.config (à ne pas confondre avec web.config de Views)
dans la section <system.web>

<system.web>
...
H I ©
EL
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
U
<providers>
O
LM
<clear/>

r e E
<add name="CustomRoleProvider" type="AspNetSecurity.
f
Configurations.CustomRoleProvider"/>
</providers>
ch
</roleManager>
©A
AspNetSecurity est le nom du projet

H & H: Research and Training 30 / 33


Les Rôles

Gestion d’utilisateurs

Pour tester

H I ©
EL
Créer les rôles Admin et User dans la base de données (via
U
Explorateur d’objets SQL Server) et attribuer ces rôles
O
aux différents utilisateurs
f E LM
ch r e
Utiliser les décorateurs suivants [Authorize(Roles =

©A
"Admin")] pour limiter l’accès aux ressources selon le rôle défini

H & H: Research and Training 31 / 33


Les Rôles

Gestion d’utilisateurs

Autoriser plusieurs rôles

H I ©
EL
[Authorize(Roles = "Admin,User")]

OU
autoriser les utilisateurs ayant le rôle Admin ou le rôle User.
M
E
[Authorize(Roles = "Admin")]
f L
[Authorize(Roles e
chr ayant à la fois le rôle Admin et le rôle
= "User")]
autoriser lesA
utilisateurs
User. ©

H & H: Research and Training 32 / 33


Les Rôles

Utilisons les décorateurs de rôles dans HomeController

namespace AspNetSecurity.Controllers
{
public class HomeController : Controller
{
// GET: Home
[Authorize(Roles = "Admin,User")]
public ActionResult Index()
H I ©
{
UEL
return View();
O
}
f E LM
ch r e
[Authorize(Roles = "Admin")]

©A
[Authorize(Roles = "User")]
public ActionResult Both()
{
return View();
}
}
}

H & H: Research and Training 33 / 33

Vous aimerez peut-être aussi