2016-05-18 3 views
2

Ich möchte eine Beispielanwendung veröffentlichen. Ich möchte nicht, dass sich neue Benutzer registrieren, sondern nur einen einzigen Benutzer, der sich zu Testzwecken anmelden kann. Ich habe ein laufendes ASP.NET-Identity-Standardmodul, das zu einer App mit einem LocalDb hinzugefügt wurde.Entfernen Sie die Registrierung aus der Webanwendung (EF, ASP.NET Identity, Azure) und registrieren Sie einen Benutzer aus DB

Jetzt möchte ich es auf Azure setzen. Ich wollte nur den "Register" Controller entfernen, aber DB wird automatisch von Entity Framework erstellt. Da Passwörter in der DB gespeichert sind, scheint es für mich unmöglich zu sein, das Passwort dieses einzelnen Benutzers in der Datenbank einzugeben.

Ich weiß jetzt, dass ich das viel zu kompliziert gemacht habe, ich hätte diese Zugangsdaten nur im Code speichern sollen - da es keinen großen Vorteil hat, diese Anwendung zu sichern, aber da ich das schon getan habe - hätte vielleicht jemand eine Idee, wenn es eine Möglichkeit geben würde, einen Benutzernamen und ein Passwort aus der DB zu schaffen, um den Passwort-Hash zu überwinden?

+1

Ich bin mir nicht sicher, ob ich die Frage richtig verstehe, aber warum nicht beim Start der Webanwendung nach dem Benutzer suchen und ihn erstellen, wenn er noch nicht existiert? –

+0

das klingt nach einer guten Idee! – Turo

+1

Wenn Sie Code First mit EF verwenden, können Sie den Benutzer einfach in den Startlistencode aufnehmen. –

Antwort

1

Sie können dieses Benutzerkonto problemlos über Entity Framework-Migrationen erstellen - insbesondere die Methode Seed(...).

Mit Migrationen aktiviert ist, können Sie eine Configuration Klasse entlang der Linien der folgenden erstellen:

public sealed class Configuration : DbMigrationsConfiguration<YourEFContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     ContextKey = "YourEFContext"; 
    } 

    /// <summary> 
    /// This method will be called after migrating to the latest version. 
    /// </summary> 
    /// <param name="context"></param> 
    protected override void Seed(YourEFContext context) 
    { 
     CreateUserIfNotExists(context, "[email protected]", "the_password"); 
    } 

    /// <summary> 
    /// Just call directly into ASP.Net Identity to check if the user exists 
    /// If not, create them 
    /// </summary> 
    private static void CreateUserIfNotExists(YourEFContext context, string email, string password) 
    { 
     // Use your application user class here 
     var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 

     // We're using email for the username 
     if ((um.FindByEmail(email)) == null) 
     { 
      var au = new ApplicationUser 
      { 
       UserName = email, 
       Email = email 
      }; 

      var res = um.Create(au); 

      if (res.Succeeded) 
      { 
       um.AddPassword(au.Id, password); 
      } 
      else 
      { 
       Console.WriteLine("Failed to create user: {0}", res.Errors.FirstOrDefault()); 
      } 
     } 
    } 
} 

Die Seed(...) wird am Ende jeder Migration laufen, so überprüfen wir einfach zu sehen, ob unsere Benutzer vorhanden ist, und wenn nicht, erstellen Sie sie und weisen Sie das bekannte Passwort zu.

+0

danke Brendan, ich arbeite daran, wo ich dieses Szenario oder sehr ähnlich, aber die Seed-Methode scheint nicht standardmäßig von Identity aufgerufen werden. Es sieht so aus, als ob ich den Seed von Global.asax einrichten sollte, wie Database.SetInitializer (new DbInitializer()); } interne Klasse DbInitializer: MigrateDatabaseToLatestVersion {} – Turo

+0

Nein - wenn Sie eine Migration ausführen, wird es ausgeführt. Dies könnte der Fall sein, wenn Sie die 'uodate-database' von der Paketmanager-Konsole ausführen oder wenn Sie automatische Migrationen konfigurieren. Das Ausführen von global wird jedes Mal ausgeführt, wenn der AppPool wiederverwendet wird. –

0

Es ist eigentlich ziemlich einfach und ich brauchte das vorher. Legen Sie dies in den Application_Start Ihre Global.asax, wenn Sie nur einen Benutzer wünschen:

if (!Roles.RoleExists("Administrator")) 
{ 
    Roles.CreateRole("Administrator"); 
} 

if (Membership.GetUser("Admin") == null) 
{ 
    Membership.CreateUser("Admin", "Password"); 
    Roles.AddUserToRole("Admin", "Administrator"); 
} 

Es gibt eine Menge Dinge, die Sie mit der Standard-Sicherheitsmodul zu tun. Siehe MSDN für mehr.

+1

danke Manfred, ich fürchte, obwohl deine Lösung über SimpleMembership ist, während ich Identity verwende. Basierend auf JamesBlonds Hinweis, ich weiß, was zu tun ist, sollte ich die Datenbank mit diesem Benutzer erstellen. – Turo

Verwandte Themen