Introduction à ASP.NET Identity

Le système d’appartenance ASP.NET a été introduit avec ASP.NET 2.0 en 2005, et depuis lors, il y a eu de nombreux changements dans la façon dont les applications web gèrent généralement l’authentification et l’autorisation. ASP.NET Identity est un nouveau regard sur ce que doit être le système d’appartenance lorsque vous créez des applications modernes pour le web, le téléphone ou la tablette.

Arrière-plan : appartenance à ASP.NET

Appartenance ASP.NET

ASP.NET l’appartenance a été conçue pour résoudre les exigences d’appartenance aux sites qui étaient courantes en 2005, ce qui impliquait l’authentification par formulaire et une base de données SQL Server pour les noms d’utilisateur, les mots de passe et les données de profil. Aujourd’hui, il existe un éventail beaucoup plus large d’options de stockage de données pour les applications web, et la plupart des développeurs veulent permettre à leurs sites d’utiliser des fournisseurs d’identité sociale pour les fonctionnalités d’authentification et d’autorisation. Les limitations de ASP.NET conception de l’appartenance rendent cette transition difficile :

  • Le schéma de base de données a été conçu pour SQL Server et vous ne pouvez pas le modifier. Vous pouvez ajouter des informations de profil, mais les données supplémentaires sont regroupées dans une autre table, ce qui les rend difficiles d’accès par tous les moyens, sauf via l’API fournisseur de profil.
  • Le système du fournisseur vous permet de modifier le magasin de données de stockage, mais le système est conçu selon des hypothèses appropriées pour une base de données relationnelle. Vous pouvez écrire un fournisseur pour stocker des informations d’appartenance dans un mécanisme de stockage non relationnel, tel que des tables de stockage Azure, mais vous devez ensuite contourner la conception relationnelle en écrivant beaucoup de System.NotImplementedException code et de nombreuses exceptions pour les méthodes qui ne s’appliquent pas aux bases de données NoSQL.
  • Étant donné que la fonctionnalité de connexion/déconnexion est basée sur l’authentification par formulaire, le système d’appartenance ne peut pas utiliser OWIN. OWIN inclut des composants d’intergiciel pour l’authentification, notamment la prise en charge des connexions à l’aide de fournisseurs d’identité externes (comme les comptes Microsoft, Facebook, Google, Twitter) et les connexions à l’aide de comptes d’organisation provenant de Active Directory local ou d’Azure Active Directory. OWIN prend également en charge OAuth 2.0, JWT et CORS.

ASP.NET appartenance simple

ASP.NET simple adhésion a été développée en tant que système d’adhésion pour pages Web ASP.NET. Il a été publié avec WebMatrix et Visual Studio 2010 SP1. L’objectif de l’appartenance simple était de faciliter l’ajout de fonctionnalités d’appartenance à une application Pages web.

L’appartenance simple a facilité la personnalisation des informations de profil utilisateur, mais elle partage toujours les autres problèmes liés à l’appartenance ASP.NET, et elle présente certaines limitations :

  • Il était difficile de conserver les données du système d’appartenance dans un magasin non relationnel.
  • Vous ne pouvez pas l’utiliser avec OWIN.
  • Il ne fonctionne pas bien avec les fournisseurs d’appartenance ASP.NET existants, et il n’est pas extensible.

Fournisseurs universels ASP.NET

Fournisseurs universels ASP.NET ont été élaborés pour permettre la conservation de l’information sur l’adhésion dans Microsoft Azure SQL Database, et ils travaillent également avec SQL Server Compact. Les Fournisseurs universels ont été basés sur Entity Framework Code First, ce qui signifie que le Fournisseurs universels peut être utilisé pour conserver les données dans n’importe quel magasin pris en charge par EF. Avec la Fournisseurs universels, le schéma de base de données a également été beaucoup nettoyé.

Les Fournisseurs universels reposent sur l’infrastructure d’appartenance ASP.NET, de sorte qu’elles présentent toujours les mêmes limitations que le fournisseur SqlMembership. Autrement dit, ils ont été conçus pour les bases de données relationnelles et il est difficile de personnaliser les informations de profil et d’utilisateur. Ces fournisseurs utilisent également toujours l’authentification par formulaire pour les fonctionnalités de connexion et de déconnexion.

ASP.NET Identity

Comme l’histoire de l’appartenance à ASP.NET a évolué au fil des ans, l’équipe ASP.NET a beaucoup appris des commentaires des clients.

L’hypothèse selon laquelle les utilisateurs se connectent en entrant un nom d’utilisateur et un mot de passe qu’ils ont inscrits dans votre propre application n’est plus valide. Le web est devenu plus social. Les utilisateurs interagissent entre eux en temps réel par le biais de canaux sociaux tels que Facebook, Twitter et d’autres sites web sociaux. Les développeurs veulent que les utilisateurs puissent se connecter avec leurs identités sociales afin qu’ils puissent avoir une expérience riche sur leurs sites web. Un système d’appartenance moderne doit activer les connexions basées sur la redirection vers des fournisseurs d’authentification tels que Facebook, Twitter et autres.

À mesure que le développement web a évolué, les modèles de développement web ont évolué. Le test unitaire du code d’application est devenu une préoccupation centrale pour les développeurs d’applications. En 2008, ASP.NET a ajouté une nouvelle infrastructure basée sur le modèle MVC (Model-View-Controller), en partie pour aider les développeurs à créer des applications ASP.NET testables unitaires. Les développeurs qui voulaient tester unitairement leur logique d’application voulaient également pouvoir le faire avec le système d’appartenance.

Compte tenu de ces changements dans le développement d’applications web, ASP.NET Identity a été développé avec les objectifs suivants :

  • Un système d’identité ASP.NET

    • ASP.NET Identity peut être utilisé avec toutes les infrastructures de ASP.NET, telles que ASP.NET MVC, Web Forms, Pages web, API web et SignalR.
    • ASP.NET Identity peut être utilisé lorsque vous créez des applications web, téléphoniques, de magasin ou hybrides.
  • Facilité de connexion des données de profil sur l’utilisateur

    • Vous contrôlez le schéma des informations d’utilisateur et de profil. Par exemple, vous pouvez facilement activer le système pour stocker les dates de naissance entrées par les utilisateurs lorsqu’ils inscrivent un compte dans votre application.
  • Contrôle de persistance

    • Par défaut, le système ASP.NET Identity stocke toutes les informations utilisateur dans une base de données. ASP.NET Identity utilise Entity Framework Code First pour implémenter tout son mécanisme de persistance.
    • Étant donné que vous contrôlez le schéma de base de données, les tâches courantes telles que la modification des noms de table ou la modification du type de données des clés primaires sont faciles à effectuer.
    • Il est facile de connecter différents mécanismes de stockage tels que SharePoint, Azure Storage Table Service, bases de données NoSQL, etc., sans avoir à lever d’exceptions System.NotImplementedExceptions .
  • Testabilité unitaire

    • ASP.NET Identity rend l’application web plus testable à l’unité. Vous pouvez écrire des tests unitaires pour les parties de votre application qui utilisent ASP.NET Identity.
  • Fournisseur de rôles

    • Il existe un fournisseur de rôles qui vous permet de restreindre l’accès à certaines parties de votre application par rôles. Vous pouvez facilement créer des rôles tels que « Administration » et ajouter des utilisateurs à des rôles.
  • Basé sur les revendications

    • ASP.NET Identity prend en charge l’authentification basée sur les revendications, où l’identité de l’utilisateur est représentée sous la forme d’un ensemble de revendications. Les revendications permettent aux développeurs d’être beaucoup plus expressifs dans la description de l’identité d’un utilisateur que les rôles ne le permettent. Alors que l’appartenance à un rôle n’est qu’une valeur booléenne (membre ou non membre), une revendication peut inclure des informations détaillées sur l’identité et l’appartenance de l’utilisateur.
  • Fournisseurs de connexion sociale

    • Vous pouvez facilement ajouter à votre application des connexions sociales telles que Compte Microsoft, Facebook, Twitter, Google et autres, et stocker les données spécifiques de l’utilisateur dans votre application.
  • Intégration OWIN

    • ASP.NET’authentification est désormais basée sur le middleware OWIN qui peut être utilisé sur n’importe quel hôte OWIN. ASP.NET Identity n’a aucune dépendance vis-à-vis de System.Web. Il s’agit d’une infrastructure OWIN entièrement conforme et peut être utilisée dans n’importe quelle application hébergée OWIN.
    • ASP.NET Identity utilise l’authentification OWIN pour la connexion/déconnexion des utilisateurs du site web. Cela signifie qu’au lieu d’utiliser FormsAuthentication pour générer le cookie, l’application utilise OWIN CookieAuthentication pour ce faire.
  • Package NuGet

    • ASP.NET Identity est redistribuée en tant que package NuGet installé dans les modèles d’API ASP.NET MVC, Web Forms et Web fournis avec Visual Studio 2017. Vous pouvez télécharger ce package NuGet à partir de la galerie NuGet.
    • La publication de ASP.NET Identity en tant que package NuGet permet à l’équipe ASP.NET d’itérer plus facilement sur les nouvelles fonctionnalités et les correctifs de bogues, et de les fournir aux développeurs de manière agile.

Bien démarrer avec ASP.NET Identity

ASP.NET Identity est utilisé dans les modèles de projet Visual Studio 2017 pour ASP.NET MVC, Web Forms, API web et SPA. Dans cette procédure pas à pas, nous allons illustrer comment les modèles de projet utilisent ASP.NET Identity pour ajouter des fonctionnalités d’inscription, de connexion et de déconnexion d’un utilisateur.

ASP.NET Identity est implémenté à l’aide de la procédure suivante. L’objectif de cet article est de vous donner une vue d’ensemble de ASP.NET Identity. vous pouvez le suivre pas à pas ou simplement lire les détails. Pour obtenir des instructions plus détaillées sur la création d’applications à l’aide de ASP.NET Identity, notamment l’utilisation de la nouvelle API pour ajouter des utilisateurs, des rôles et des informations de profil, consultez la section Étapes suivantes à la fin de cet article.

  1. Créez une application MVC ASP.NET avec des comptes individuels. Vous pouvez utiliser ASP.NET Identity dans ASP.NET MVC, Web Forms, API web, SignalR, etc. Dans cet article, nous allons commencer par une application MVC ASP.NET.

    Image de la nouvelle fenêtre de projet ASP dot Net

  2. Le projet créé contient les trois packages suivants pour ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Ce package a l’implémentation Entity Framework de ASP.NET Identity, qui permet de conserver les données et le schéma ASP.NET Identity dans SQL Server.
    • Microsoft.AspNet.Identity.Core
      Ce package a les interfaces principales pour ASP.NET Identity. Ce package peut être utilisé pour écrire une implémentation pour ASP.NET Identity qui cible différents magasins de persistance tels que stockage Table Azure, bases de données NoSQL, etc.
    • Microsoft.AspNet.Identity.OWIN
      Ce package contient des fonctionnalités utilisées pour connecter l’authentification OWIN avec ASP.NET Identity dans ASP.NET applications. Cela est utilisé lorsque vous ajoutez une fonctionnalité de connexion à votre application et appelez le middleware OWIN Cookie Authentication pour générer un cookie.
  3. Création d’un utilisateur.
    Lancez l’application, puis cliquez sur le lien Inscrire pour créer un utilisateur. L’image suivante montre la page Inscrire qui collecte le nom d’utilisateur et le mot de passe.

    Image de la création d’un compte

    Lorsque l’utilisateur sélectionne le bouton Inscrire , l’action Register du contrôleur de compte crée l’utilisateur en appelant l’API ASP.NET Identity, comme indiqué ci-dessous :

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Connectez-vous.
    Si l’utilisateur a été créé avec succès, il est connecté par la SignInAsync méthode .

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    La SignInManager.SignInAsync méthode génère un ClaimsIdentity. Étant donné que ASP.NET Identity et OWIN Cookie Authentication sont un système basé sur des revendications, l’infrastructure exige que l’application génère un ClaimsIdentity pour l’utilisateur. ClaimsIdentity contient des informations sur toutes les revendications de l’utilisateur, telles que les rôles auxquels appartient l’utilisateur.

  5. Fermez la session.
    Sélectionnez le lien Déconnexion pour appeler l’action Fermer la session dans le contrôleur de compte.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    Le code mis en surbrillance ci-dessus montre la méthode OWIN AuthenticationManager.SignOut . Cela est analogue à la méthode FormsAuthentication.SignOut utilisée par le module FormsAuthentication dans Web Forms.

Composants de ASP.NET Identity

Le diagramme ci-dessous montre les composants du système d’identité ASP.NET ( sélectionnez-le ou sur le diagramme pour l’agrandir). Les packages en vert constituent le système d’identité ASP.NET. Tous les autres packages sont des dépendances qui sont nécessaires pour utiliser le système d’identité ASP.NET dans ASP.NET applications.

Diagramme montrant les composants du système d’identité A SP dot Net

Voici une brève description des packages NuGet non mentionnés précédemment :

  • Microsoft.Owin.Security.Cookies
    Intergiciel qui permet à une application d’utiliser l’authentification basée sur les cookies, similaire à ASP. Authentification par formulaire de NET.
  • EntityFramework
    Entity Framework est la technologie d’accès aux données recommandée par Microsoft pour les bases de données relationnelles.

Migration de l’appartenance à ASP.NET Identity

Nous espérons bientôt fournir des conseils sur la migration de vos applications existantes qui utilisent ASP.NET’appartenance ou l’appartenance simple vers le nouveau système d’identité ASP.NET.

Étapes suivantes