Ich verwende das ASP.NET Identity Sample vom Asp-Team und versuche, die Datenbank für das IdentityDbContext
... zu ändern.
Ich habe es mit dem Konstruktor versucht
public MyDbContext() : base("MyConnectionString") { } // base is IdentityDbContext
wie bei einer DbContext-Klasse.
Das funktioniert gut, bis ich versuche, einen Benutzer zu registrieren ...
await IdentityStore.CreateLocalUser(user, model.Password)
gibt false
... keinen Fehler, nichts zurück.
Irgendwelche Ideen, wie man das behebt?
Bearbeiten:
Dateiname ist Models\AppModel.cs
, dort ist der MyDbContext class
ursprünglich war es
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
ich habe es in geändert
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
die Verbindungszeichenfolge funktioniert, weil ich andere Projekte habe, die das gleiche verwenden, und sie laufen gut.
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
Die Antwort ist nicht mehr gültig für die Version 1.0, die mit VS2013 in der neuen mvc5-Anwendung geliefert wird. Um dies jetzt zu tun:
Deklarieren Sie eine Klasse wie:
public class AppUserStore : UserStore<IdentityUser>
{
public AppUserStore():base(new MY_IDENTITYDBCONTEXT())
{
}
}
Und bei Startup.Auth.cs ändern
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
zu
UserManagerFactory = () => new UserManager<IdentityUser>(new AppUserStore());
Ohne dies wird Ihr IdentityDbContext-Konstruktor (und beispielsweise OnModelCreating
) nicht ausgeführt, wenn Sie einen Benutzer mit asp.net-Identität erstellen.
Ich hatte das gleiche Problem und hatte ein wenig zu kämpfen, da es im Netz noch nicht viel Material über ASP.NET Identity gibt. Nachdem ich die Baugruppen überprüft hatte, stellte ich fest, dass es eigentlich einfach ist.
Suchen Sie einfach den Ort, an dem Ihr AuthenticationIdentityManager initialisiert wird, und verwenden Sie die IdentityStore-Überladung, um Ihren Datenbankkontext wie folgt anzugeben:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new Model()));
Meine Modellklasse erbt DbContext. Hoffe das hilft.
RobM hat die umfassende Antwort und Rob B hat die einfache Antwort.
In Ihrem Szenario setzen Sie Ihre Basis auf "MyConnectionString", das in Ihrer Konfigurationsdatei nicht vorhanden ist.
<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") { }
}
Welchen Namen Sie Ihrem connectionString auch immer geben, er muss mit dem übereinstimmen, den Sie in Ihrem DbContext haben: base
<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") { }
}
Wenn Sie lediglich die Verbindungszeichenfolge ändern müssen, die vom Identitätsanbieter verwendet wird, ist das Folgende nicht sehr elegant, scheint jedoch zu funktionieren. Suchen Sie, wo die IdentityManager-Klasse instanziiert ist, und fügen Sie Folgendes hinzu:
//Leave this untouched:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore());
//...and add this:
((IdentityStore)identityManager.Store).DbContext.Configuration
.Database.Connection.ConnectionString = "your connection string here";
Suchen Sie nach der Klasse, die von IdentityDbConect erbt, z.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Ändern Sie dann "DefaultConnection" in den Namen einer Verbindungszeichenfolge, die in Ihrer web.config angegeben ist.
Da es bei der Umstellung auf RTM eine Menge Änderungen gibt, habe ich die SPA-Vorlage aktualisiert, die einen WebApi-Controller für alle Identitätsanmeldungen und dergleichen verwendet. Es ist eine wirklich coole Vorlage, wenn Sie es nicht gesehen haben.
Ich füge meinen gesamten Code hier ein: https://github.com/s093294/aspnet-identity-rtm/tree/master
(Beachten Sie, es ist nur zur Inspiration. Ich habe es nur zum Laufen gebracht und nichts weiter. Habe auch ein oder zwei Bugs).