Académique Documents
Professionnel Documents
Culture Documents
Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Introduction
2 Le modèle
3 Le contrôleur
4 Les vues
5 Le fichier Web.config
6 Tester
7 Les Rôles
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
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
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
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();
}
}
}
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>
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>
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
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; }
}
}
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; }
}
}
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
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
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
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;
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
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
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 à
:
Gestion d’utilisateurs
Le contrôleur LoginController : partie connexion (1) GET
ch r e
personne = (from p in db.Personnes
©A
where p.Nom == HttpContext.User.Identity.
Name
select p).FirstOrDefault();
}
}
return View(personne);
}
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);
}
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
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" />
}
Gestion d’utilisateurs
c h r e
<forms loginUrl="˜/Login/Index" />
©A
</authentication>
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
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
Gestion d’utilisateurs
Gestion d’utilisateurs
©A
public bool Sportif { get; set; }
[Required]
public string Password { get; set; }
public virtual List<Role> Roles { get; set; }
}
Gestion d’utilisateurs
N’oublions pas de
I ©
Régénérer la base de données (faire la migration)
H
UEL
O
f E LM
ch r e
©A
Gestion d’utilisateurs
N’oublions pas de
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
Gestion d’utilisateurs
Gestion d’utilisateurs
©A
}
}
Gestion d’utilisateurs
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();
}
}
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;
}
}
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
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
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
Gestion d’utilisateurs
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. ©
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();
}
}
}