web-dev-qa-db-fra.com

ASP.Net Identity comment définir la base de données cible?

J'utilise ASP.NET Identity Sample de l'Asp-Team, et j'essaie de changer la base de données pour le IdentityDbContext...

Je l'ai essayé avec le constructeur

public MyDbContext() : base("MyConnectionString") { } // base is IdentityDbContext

comme avec une classe DbContext.

Cela fonctionne bien jusqu'à ce que j'essaie d'enregistrer un utilisateur ...

await IdentityStore.CreateLocalUser(user, model.Password)

renvoie false... aucune erreur, rien.

Des idées pour réparer celà?

Éditer:

Le nom de fichier est Models\AppModel.cs, il y a le MyDbContext class

à l'origine c'était

public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}

je l'ai changé en

public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
    public MyDbContext() : base("MyConnectionString") { }
}

la chaîne de connexion fonctionne car j'ai d'autres projets utilisant le même, et ils fonctionnent bien.

<connectionStrings>
    <add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
23
Nefarion

La réponse n'est plus valable pour la version 1.0 fournie avec VS2013 sur la nouvelle application mvc5. Pour ce faire maintenant:

Déclarez une classe comme:

public class AppUserStore : UserStore<IdentityUser>
{
    public AppUserStore():base(new MY_IDENTITYDBCONTEXT())
    {

    }
}

Et sur Startup.Auth.cs changer

UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());    

à

UserManagerFactory = () => new UserManager<IdentityUser>(new AppUserStore());

Sans cela, votre constructeur IdentityDbContext (et OnModelCreating, par exemple) ne s'exécutera pas lors de la création d'un utilisateur avec une identité asp.net.

5
Leo

J'ai eu le même problème et j'ai lutté un peu car il n'y a pas encore beaucoup de matériel sur Internet concernant l'identité ASP.NET. Après avoir vérifié les assemblages, j'ai trouvé que c'était en fait simple.

Trouvez simplement l'endroit où votre AuthenticationIdentityManager est initialisé et utilisez la surcharge IdentityStore pour spécifier votre contexte de base de données, comme ceci:

IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new Model()));

Ma classe de modèle hérite de DbContext. J'espère que cela t'aides.

2
Joao de Araujo

RobM a la réponse complète et Rob B a la réponse simple.

Dans votre scénario, vous définissez votre base sur "MyConnectionString" qui n'existe pas dans votre fichier de configuration.

<connectionStrings>
    <add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>

public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
    public MyDbContext() : base("MyConnectionString") { }
}

Quel que soit le nom que vous donnez à votre connexion, la chaîne doit correspondre à celle que vous avez dans votre base DbContext:

<connectionStrings>
    <add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>

public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
    public MyDbContext() : base("MySailorContext") { }
}
2
Terri

Si tout ce dont vous avez besoin est de changer la chaîne de connexion utilisée par le fournisseur d'identité, ce qui suit n'est pas très élégant mais semble fonctionner. Recherchez où la classe IdentityManager est instanciée et ajoutez ce qui suit:

//Leave this untouched:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore());
//...and add this:
((IdentityStore)identityManager.Store).DbContext.Configuration
    .Database.Connection.ConnectionString = "your connection string here";
1
Konamiman

Recherchez la classe qui hérite d'IdentityDbConect, par exemple:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }
    }

Remplacez ensuite "DefaultConnection" par le nom d'une chaîne de connexion identifiée dans votre web.config.

1
Rob Bowman

Puisqu'il y a beaucoup de changements à ce sujet lorsque je vais sur RTM, j'ai mis à jour le modèle SPA qui utilise un contrôleur WebApi pour toutes les identités et autres. C'est un modèle vraiment cool, si vous ne l'avez pas vu.

J'ai mis tout mon code ici: https://github.com/s093294/aspnet-identity-rtm/tree/master

(Notez, c'est uniquement pour l'inspiration. Je l'ai seulement fait fonctionner et rien de plus. Avoir correctement un bug ou deux aussi).

1