Ich versuche, ein einfaches Anmeldesystem von Grund auf mithilfe des Code-First-Ansatzes mit ASP.NET MVC v5, Entity Framework v7 und Identity v3 zu erstellen. Ich modelliere meine App nach der ASP.NET MVC-App mit einer individuellen Benutzeranmeldevorlage, auf die Visual Studio kommt.

Ich möchte nur, dass der Benutzer ein Konto erstellt und dieses Konto in einer Datenbank speichert.

Hier ist der Code, den ich bisher habe:

Startup.cs :

public class Startup
{
    public IConfigurationRoot Configuration { get; set; }
    public Startup()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json");
        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
        app.UseStaticFiles();
        app.UseIdentity();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

    public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}

appsettings.json enthält diesen Code für die Verbindung zur Datenbank:

"Data": {
  "DefaultConnection": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=SimpleAuthenticationApp;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Hier ist der Code für die Aktion POST registrieren in Controllers / AccountController.cs :

    [HttpPost]
    public async Task<IActionResult> Register (RegisterViewModel model)
    {
        try
        {
            var user = new ApplicationUser { UserName = model.Email };
            IdentityResult result = await _userManager.CreateAsync(user, model.Password);
            Console.WriteLine(result);
            return View("Home", "Index");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return View();
        }
    }

In diesem Code ist RegisterViewModel nur ein ViewModel mit Feldern für E-Mail, Passwort und ConfirmPassword. Die Ansicht Konto / Register ist nur ein Formular, in dem nach diesen Feldern gefragt wird. ApplicationUser ist eine Klasse, die sich von IdentityUser erstreckt.

In der POST-Route habe ich einen Haltepunkt am try-Block festgelegt, und wenn er in den catch-Block eintritt, lautet die Ausnahme "Ungültiger Objektname AspNetUsers".

Bevor ich den ersten Benutzer in dieser App erstelle, gibt es keine Datenbank. Ich registriere einen neuen Benutzer, die App führt mich zu einer Fehlerseite mit der Schaltfläche "Die Anwendung bestehender Migrationen für ApplicationDbContext kann dieses Problem lösen" mit einer Schaltfläche, um Migrationen anzuwenden. Wenn ich auf die Schaltfläche drücke, wird die Datenbank erstellt. Ich habe festgestellt, dass beim Ausführen der Standard-MVC mit Benutzer-App ein Migrations -Ordner vorhanden ist, der 00000000000000_CreateIdentitySchema.cs und ApplicationDbContextModelSnapshot.cs enthält Als ob sie die Einstellungen zum Erstellen der Datenbank mit den benötigten Tabellen enthalten. Ich habe versucht, diese Dateien in meiner App zu verwenden, aber es machte keinen Unterschied.

Meine Fragen:

  • Wie erstellt Identity / Entity Framework die Datenbank mit Tabellen? für Benutzerinformationen? Es scheint seltsam, dass ich mich bewerben muss Migrationen ", bevor die Datenbank für die App erstellt werden kann.

  • Was kann ich in meiner eigenen App tun, damit ein einfaches Benutzer-Login funktioniert? Andere Ansätze oder Rahmenbedingungen sind willkommen.

1
jmk22 27 Dez. 2015 im 05:43

2 Antworten

Beste Antwort

EntityFramework verwendet ein kontinuierliches Migrationskonzept, um Ihr Datenbankschema bei Bedarf zu aktualisieren. Standardmäßig erstellen die ersten Migrationen die Benutzer- / Identitätstabellen, wie Sie bereits festgestellt haben. Sie müssen nichts direkt mit dem Code im Migrationsordner tun. Wenn Sie einen Migrationsinitialisierer einrichten, kann die Datenbank beim Start initialisiert / aktualisiert werden:

Ich empfehle, diesen Rundgang durchzulesen, um besser zu verstehen, was los ist und was Sie damit tun können:

https://msdn.microsoft.com/en-us/data/jj591621.aspx

Das oben erwähnte Szenario der automatischen Initialisierung / Aktualisierung wird in diesem Artikel behandelt.

2
Robert Foster 27 Dez. 2015 im 02:53

Ehrlich gesagt musste ich hier einen langen Artikel darüber schreiben: https://medium.com/@goodealsnow/asp-net-core-identity-3-0-6018fc151b4 Im Allgemeinen können Sie die Dotnet-CLI verwenden, um Migrationen bereitzustellen dotnet ef migrations fügt Version2CoolWaves -o Data \ Migrations hinzu

Aber lesen Sie meinen vollständigen Artikel für Schritt für Schritt Tutorial.

0
hidden 19 Sept. 2017 im 01:09