2014-01-24 6 views
13

Wir haben ein neues ASP.NET 4.5.1 Projekt angelegt haben, wie folgt:die Datenbank ändern, in der ASP.NET Identitätsbenutzerdaten speichern

  • Visual Studio 2013
  • Neues Projekt
  • Visual C#
  • Web
  • ASP.NET Web Application
  • Web API
  • ändern Authentifizierung
  • einzelne Benutzerkonten
  • Ok> Ok

In der Lösung Explorer> App_Start> Startup.Auth.cs Datei gibt den folgenden Code ist die ASP.NET Indentity konfiguriert. Wie ändern wir die Datenbank, in der UserManager Benutzerdaten speichert?

static Startup() 
{ 
    PublicClientId = "self"; 

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

    OAuthOptions = new OAuthAuthorizationServerOptions 
    { 
     TokenEndpointPath = new PathString("/Token"), 
     Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), 
     AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
     AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
     AllowInsecureHttp = true 
    }; 
} 
+2

Hat UserStore nicht mehrere Konstruktoren ... –

+1

Yup. Es hat. –

+3

Und nimmt man keinen DbContext ... –

Antwort

7

Zusätzlich zu was @ ta.speot.is und @ Shaun erwähnt: Sie können auch den Namen der Verbindungszeichenfolge übergeben (im Web gespeichert.config) im Zusammenhang mit den base constructor der IdentityDbContext

public class MyDbContext : IdentityDbContext<MyUser> 
{ 
    public MyDbContext() 
    : base("TheNameOfTheConnectionString") 
    { 
    } 
} 

Dieser tutorial enthält ein umfangreiches Beispiel.

Eine andere Möglichkeit wäre, den Namen der Verbindungszeichenfolge als Parameter Ihres Kontextkonstruktors zu verwenden und an den Basiskonstruktor zu übergeben.

+0

Aha. Sie machen MyDbContext den IdentityDbContext erben. Was ist der Unterschied zwischen dem und dem normalen DbContext? –

+0

** IdentityDbContext ** ist der von ASP.NET Identity bereitgestellte Kontext. Es erbt von ** DbContext ** und fügt zwei DbSets für die Benutzer- und Rollenverwaltung hinzu. Für weitere Informationen schauen Sie sich einen [this thread] an (http://stackoverflow.com/questions/19902756/asp-net-identity-dbcontext-confusion). –

+0

Es funktioniert nicht, können Sie sich bitte meine Frage ansehen. Danke. http://stackoverflow.com/questions/21393195/userstore-with-my-own-database – Marc

5

Fahren Sie mit eigenen DbContext zum UserStore Konstruktor oder die DefaultConnection namens Web.config Verbindungszeichenfolge ändern. So oder so sind die Kommentare von @ ta.speot.is korrekt.

Correct

// do this - it's the factory pattern 
UserManagerFactory 
=() => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext())); 

Falsche

// do NOT do this - use the preceding code. 
var userStore = new UserStore<IdentityUser>(new MyDbContext());      
var userManager = new UserManager<IdentityUser>(userStore); 
UserManagerFactory =() => userManager; 

Einzelheiten

Die UserStore Klasse stellt eine sehr einfach Benutzerverwaltung api. Im Code konfigurieren wir es zum Speichern von Benutzerdaten als Typ IdentityUser im Datenspeicher MyDbContext.

Die Klasse UserManager bietet eine übergeordnete Benutzerverwaltung api, die automatisch Änderungen an der UserStore speichert. Im Code konfigurieren wir es so, dass es die UserStore verwendet, die wir gerade erstellt haben.

Die UserManagerFactory sollte das Factory-Muster implementieren, um eine Instanz von UserManager pro Anfrage für die Anwendung zu erhalten. Andernfalls erhalten Sie die folgende Ausnahme:

Der Kontext kann nicht verwendet werden, während das Modell erstellt wird. Diese Ausnahme kann ausgelöst werden, wenn der Kontext in der OnModelCreating-Methode verwendet wird oder wenn dieselbe Kontextinstanz gleichzeitig von mehreren Threads aufgerufen wird. Beachten Sie, dass Instanzmember von DbContext und verwandten Klassen nicht garantiert Thread sicher sind.

Das ist alles.