• Aucun résultat trouvé

Le modèle de données

Dans le document Créez votre site web avec ASP.NET (Page 194-199)

III. Gérer la base de données avec Entity Framework Code First 135

11. Les relations entre entités 163

12.3. Améliorer notre modèle avec la FluentAPI

13.1.1. Le modèle de données

Lorsque vous essayez de trouver le modèle de données lié aux utilisateurs, vous pouvez être un peu rassuré : en effet nous retombons sur ce que nous avons eu l’habitude de voir dans notre cours :

— un fichier IdentityModels.cs qui va être l’objet de ce paragraphe avec les représenta-tions C# de la base de données ;

— un fichier AccountViewModels.cs qui contient tous les ViewModel qui permettent d’enregistrer un utilisateur ;

— un fichier ManageViewModel.cs qui sera dirigé vers les tâche d’administration ou simplement les modifications de son compte par l’utilisateur.

Si nous ne détaillerons pas les fichier de ViewModel, il est important de garder en mémoire que chaque modification des IdentityModels entraînera une modification des ViewModels et de leur template associé.

Le fichier IdentityModels.cs contient par défaut deux éléments :

— une classe ApplicationUser qui hérite de IdentityUser;

— un contexte de base de données.

IV. Allons plus loin avec ASP.NET

1 public bool RequireUniqueEmail { get; set; } 2 public virtual IDbSet<TRole> Roles { get; set; } 3 public virtual IDbSet<TUser> Users { get; set; }

4 protected override void OnModelCreating(DbModelBuilder modelBuilder);

5 protected override DbEntityValidationResult

ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items);

Listing 54 – les ajouts deIdentityDbContext

Pour ce qui est de notre utilisateur, il s’agit d’une classe simple qui hérite d’un objet déjà défini part ASP.NET et qui est lui-même personnalisable :

Figure 13.1. – Diagramme de classe des rôles par défaut

Par défaut, notre utilisateur ne possède que des informations qui permettent de l’identifier et de l’authentifier. C’est donc cet objet qui devra être lié aux objets tel que les articles de blog. Un auteur d’article est un ApplicationUser.

Néanmoins, ce genre d’objet n’est pas vraiment suffisant. Par exemple, où stocke-t-on l’avatar du membre ? Sa date de naissance (si on en a besoin, n’oubliez pas que c’est une donnée personnelle) ?

Deux philosophies existent alors :

— soit vous augmentez votre ApplicationUser de toutes les informations nécessaires,

— soit vous créez un second objet qui pourrait être UserProfile par exemple où toutes les informations seraient ajoutées et qui serait créé en même temps que l’objet Applica tionUser.

La méthode conseillée par ASP.NET est la première, car en plus de convenir à 99% des cas, elle est plus simple à maintenir.

!

Le choix de la méthode est très important. Si vous pensez que votre application sort des 99% évoqués au dessus, n’hésitez pas à venir poster la question sur le forum avec le tag [asp.net], nous serons heureux de vous répondre.

Pour ce qui est des rôles, Je vous propose de laisser les choses telles que ASP vous le propose mais sachez qu’il est tout à fait possible de les modifier. Imaginons que nous voulons ajouter un badge à un rôle (comme le badge staff) :

1 class RoleWithAvatar: IdentityRole:

2 {

3 public RoleWithAvatar(): super(){

4 AvatarUrl = "DefaultAvatarUrl";

5 };

6 public RoleWithAvatar(string name): super(name){

7 AvatarURL = "DefaultAvatarUrl";

8 }

9 public RoleWithAvatar(string name, string url): super(name){

10 AvatarURL = url;

11 }

12 public string AvatarURL {get; set;}

13 }

Listing 55 – Notre nouveau groupe

Il suffira ensuite de changer légèrement notre ApplicationDbContext pour lui indiquer que nous allons changer le format des rôles :

1 public class ApplicationDbContext :

IdentityDbContext<ApplicationUser, RoleWithAvatar, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>

2 {

IV. Allons plus loin avec ASP.NET

5 {

6

7 }

89 public static ApplicationDbContext Create()

10 {

11 return new ApplicationDbContext();

12 }

13 }

Listing 56 – Un petit changement dans les rôles.

i

Si dans un de vos contrôleurs vous avez besoin d’accéder aux rôles, il suffit d’utiliser la ligne suivanteRoleManager roleManager = new RoleManager<IdentityRole>(new RoleStore<RoleWithAvatar>(context));

13.1.2. [Mini TP] Restreindre les accès

i

Peut être vous souvenez-vous de ce conseil : ”Il est fortement conseillé de mettre [Authorize]sur toutes les classes de contrôleur puis de spécifier les mé thodes qui sont accessibles publiquement à l'aide de[AllowAnonymous]‘”.

C’est maintenant que nous allons pleinement le mettre en œuvre.

Comme nous sommes arriver assez loin dans ce tutoriel, vous devriez, avec un minimum d’information réussir le mini tp qui arrive.

Les attributs Authorize et AllowAnonymous sont des filtres d’autorisation. Nous reverrons plus tard le fonctionnement des filtres en général, mais l’idée c’est que ces attributs permettent d’appliquer un certains nombres d’actions avant que le code métier ne soit exécuté. Ils vérifient avec le connecteur Owin si l’utilisateur qui est en train de visité la page a bien ouvert une session authentifiée.

Notre but sera de proposer notre propre attribut d’autorisation qui fera deux vérifications :

— premièrement le visiteur est bien authentifié (comme AuthorizeAttribute)

— deuxièmement le visiteur appartient à un groupe qu’on aura défini (par exemple Staff) L’idée serait qu’à la fin on ait une action du style :

Vous voilà mieux armé pour gérer les utilisateurs de votre site. Dans une prochaine version de ce tutoriel vous aurez droit à une vidéo de démonstration vous permettant d’ajouter une authentification via les compte facebook, twitter ou encore google.

Contenu masqué

Contenu masqué n°14

1 public AuthorizedForAttribute:AuthorizeAttribute 2 {

3 public AuthorizedForAttribute(string group) super(){

4 Role = group;

5 }

6 public string Role{ get; private set;}

7 public override void OnAuthorization(AuthorizationContext filterContext){

8 super.OnAuthorization(filterContext);

9 if(filterContext.Result != null && filterContext.Result instanceof HttpUnauthorizedResult){

10 // on sait que ce n'est pas autorisé

11 return;

12 }

13 if(!filterContext.HttpContext.User.IsInRole(Role)){

14 filterContext.Result = new HttpUnauthorizedResult();

15 }

16 }

17 }

Listing 57 – Notre attribut, ce n’est qu’une solution possible.

Retourner au texte.

Dans le document Créez votre site web avec ASP.NET (Page 194-199)