web-dev-qa-db-fra.com

Déplacement du modèle d'identité ASP.NET vers la bibliothèque de classes

J'essaie de déplacer le modèle d'identité vers une bibliothèque de classes en utilisant les méthodes de ce lien:

Identité ASP.NET dans la bibliothèque de services

Problème 1: Il semble continuer à utiliser la chaîne de connexion du projet de site Web. Je l'ai surmonté en spécifiant la chaîne de connexion complète dans la bibliothèque de classes. Puis-je faire en sorte que IdentityDbContext utilise la chaîne de connexion de la bibliothèque de classes?

Problème 2: En raison du problème 1, si je supprime Entity Framework du projet de site Web. Il donnera l'erreur suivante qu'il recherche SqlClient d'EF dans le projet de site Web.

Une exception de type "System.InvalidOperationException" s'est produite dans EntityFramework.dll mais n'a pas été gérée dans le code utilisateur

Informations supplémentaires: Aucun fournisseur Entity Framework trouvé pour le fournisseur ADO.NET avec le nom invariant "System.Data.SqlClient". Assurez-vous que le fournisseur est enregistré dans la section "entityFramework" du fichier de configuration de l'application. Voir http://go.Microsoft.com/fwlink/?LinkId=260882 pour plus d'informations.

D'autres solutions sont les bienvenues tant qu'elles omettent toutes les références de la couche d'accès aux données comme EF dans le projet de site Web.

40
Joe Yap

Pour déplacer le IdentityModel dans une bibliothèque de classes (ce qui est la bonne chose à faire selon le SRP ), procédez comme suit:

  1. Créez une bibliothèque de classes. (ClassLibrary1)
  2. À l'aide de NuGet, ajoutez une référence à Microsoft.AspNet.Identity.EntityFramework. Cela ajoutera également automatiquement d'autres références.
  3. Ajoutez une référence dans votre site Web à ClassLibrary1
  4. Recherchez WebSite/Models/IdentityModel.cs et déplacez-le vers ClassLibrary1.
  5. Faites ressembler IdentityModel.cs à ceci:

    public class ApplicationUser : IdentityUser
    {
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("YourContextName")
        {
        }
    }
    
  6. Assurez-vous que Web.config de votre site Web a YourContextName pointant vers la bonne base de données dans la section. (Remarque: cette base de données peut et doit contenir vos données d'application).

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere"
      providerName="System.Data.SqlClient" />
    
  7. Faites hériter votre classe EF Context de votre ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

Lorsque quelqu'un de votre site essaie de se connecter ou de s'enregistrer, le système d'identité les achemine vers votre base de données avec toutes vos données, y compris les tables d'identité.

C'est bon!

67
Rap

Une mise à jour de la réponse de @ Rap pour EF6 et Identity 2.0:

  1. Créez une bibliothèque de classes. (ClassLibrary1)
  2. À l'aide de NuGet, ajoutez une référence à Microsoft.AspNet.Identity.EntityFramework et Microsoft.AspNet.Identity.Owin.
  3. Ajoutez une référence dans votre site Web à ClassLibrary1
  4. Recherchez WebSite/Models/IdentityModel.cs et déplacez-le vers ClassLibrary1.
  5. IdentityModel.cs devrait ressembler à ceci, pas besoin de changer quoi que ce soit:

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
            // Add custom user claims here
            return userIdentity;
        }
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
    
  6. Assurez-vous que Web.config de votre site Web a un contexte pointant vers la bonne base de données dans la section. (Remarque: cette base de données peut et doit contenir vos données d'application).

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  7. Faites hériter votre classe EF Context de votre ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    
7
Ogglas

Que voulez-vous dire en déplaçant l'identité dans une bibliothèque de classes? être utilisé comme référence? J'ai mon gestionnaire d'utilisateurs et mon utilisateur personnalisés dans une bibliothèque distincte, mais c'est tout.

Les éléments d'identité nécessitent une sorte de stockage de données. Si vous configurez Identity pour utiliser EF, assurez-vous d'obtenir le package de nuget supplémentaire pour celui-ci, et vous devriez pouvoir passer la chaîne de connexion lorsque vous créez le contexte.

Du haut de ma tête...

var mgr = new UserManager<ApplicationUser>(
     new IUserStore_ofYourChoice<ApplicationUser>(
       new DbContextName("ConnectionStringOverload"));

Je pense que le magasin EF est "UserStore", je dois vérifier.

Il existe actuellement près d'une douzaine de packages de nugets différents pour les banques de données pour Identity. Vous n'êtes pas obligé d'utiliser EF, mais cela nécessite un magasin quelconque.

** MODIFIER **

De plus, comme référence, il utilisera toujours la configuration, et donc ses chaînes de connexion définies, du projet principal par défaut, c'est ainsi que cela fonctionne, donc ça va.

1
William

Il y a quelques règles que vous devez connaître et vous rappeler.

Premièrement, le projet Web utilisera TOUJOURS et UNIQUEMENT les fichiers web.config qu'il trouve dans sa propre période de projet. Peu importe ce que vous mettez dans un autre fichier de configuration ailleurs dans votre solution. Le projet Web ne peut utiliser que ce qu'il trouve dans son propre projet. Si vous avez une chaîne de connexion dans un autre projet, vous devez la répliquer dans le projet Web, sinon elle ne sera jamais trouvée.

Deuxièmement, en supposant que le projet Web est votre projet de démarrage et en supposant que vous utilisez des migrations de données (puisque Identity l'utilise), notez que le gestionnaire de packages utilisera TOUJOURS la chaîne de connexion qu'il trouve dans le projet de démarrage. Par conséquent, le gestionnaire de packages, pour update-database, n'utilisera pas la chaîne de connexion dans votre projet de modèle.

La solution simple est la suivante: 1. Copiez votre chaîne de connexion de votre projet modèle vers votre projet Web. 2. Dans la console du gestionnaire de packages, assurez-vous que la liste déroulante pour sélectionner le contexte pointe vers votre projet de modèle.

1
silverfox1948

Question 1:-

Je suppose que je peux utiliser la solution trouvée sur le lien ci-dessous: -

Configuration de l'entité Framework pour la chaîne de connexion dynamique

Question 2:-

Je crois que le framework d'entité construit la façon dont le temps d'exécution utilisera le web.config de ce projet. Les instructions de Microsoft suggèrent également que

http://msdn.Microsoft.com/en-us/library/vstudio/cc716677 (v = vs.100) .aspx

0
Joe Yap