2016-04-24 12 views
1

Ich benutze Identität 3. Ich möchte einen Admin-Benutzer beim Start zu seed.Seeding Benutzer mit int IDs schlägt in Asp.net Kern MVC6

Ich habe die Zeichenfolge IDs in "Int" IDs als Beispiel SwiftCourier auf GitHub konvertiert. Identität 3 unterscheidet sich in einigen Aspekten und dies gilt für die Einstellung von "Int" für IDs wie im Beispiel SwiftCourier im Vergleich zu Identity 2 und die Einstellung von "Int" IDs.

Ich habe dies getan, indem "int" nach meinem Benutzer platzieren:

public class User : IdentityUser<int>{...} 

Nach meiner Rolle:

public class Role : IdentityRole<int> 

und in startup.cs in Konfigurationsdienste ich das eingegeben:

  services.AddIdentity<User, Role>(options => options.User.AllowedUserNameCharacters = null) 
      .AddEntityFrameworkStores<JobsDbContext, int>() 
      .AddUserStore<UserStore<User, Role, JobsDbContext, int>>() 
      .AddRoleStore<RoleStore<Role, JobsDbContext, int>>() 
      .AddDefaultTokenProviders(); 

Ich habe dann dies verwendet, um Rollen und es funktioniert mit ganzzahligen IDs:

public static void EnsureRolesCreated(this IApplicationBuilder app) 
    { 
     var context = app.ApplicationServices.GetService<JobsDbContext>(); 
     if (context.AllMigrationsApplied()) 
     { 
      var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>(); 

      var Roles = new List<Role>(); 

      Roles.Add(new Role { Name = "Admin", Description = "Users able to access all areas" }); 
      Roles.Add(new Role { Name = "Technician", Description = "Users able to access just the schedule" }); 

      foreach (var role in Roles) 
      { 
       if (!roleManager.RoleExistsAsync(role.Name.ToUpper()).Result) 
       { 
        roleManager.CreateAsync(role); 
       } 
      } 
     } 
    } 

So weit so gut ... Ich möchte nur ein Admin-Benutzer auf Saatgut, mit zu beginnen und das ist, wo ich nicht ...

ich folgende Stackoverflow example von @Guy verwendet haben.

ich mit Users mit dieser Linie habe Schwierigkeiten:

await new UserStore<User>(context).CreateAsync(userWithRoles.User); 

Es auf „User“ schlägt fehl, die meine ApplicationUser nur umbenannt.

Der Fehler, den ich bekommen ist:

The type 'JobsLedger.Models.Identity.User' cannot be used as type parameter 'TUser' in the generic type or method 'UserStore<TUser>'. There is no implicit reference conversion from 'JobsLedger.Models.Identity.User' to 'Microsoft.AspNet.Identity.EntityFramework.IdentityUser<string>'. 

Es scheint auf der Tatsache zu beschweren, dass die ID „int“ ist Ich denke,

Wie kann ich die Users Arbeit mit einem „int“ machen in dieser Hinsicht? Es ist int in der Startup.cs wie oben gezeigt.

Wenn ich einen benutzerdefinierten "UserStore" erstellen, der mit "int" funktioniert .. Wie machst du es in Identity 3?

+0

Ich gab ein Beispiel für das Hinzufügen des Benutzers zu Rollen, hat es geholfen? Wenn es dann pls markiert die Antwort als richtige Antwort – jamiedanq

+0

Ich habe gerade getan. Ich kann nicht den Benutzer hier mit int Ids erstellt werden, geschweige denn Rollen zum Benutzer hinzufügen .. seine fehlgeschlagenen Benutzerstore .. – si2030

Antwort

2

Es ist vielleicht nicht die eleganteste Lösung, aber das funktioniert ...

Mein Ziel war es, einen Admin-Benutzer auf Saatgut und auch auf die Admin-Rolle hinzugefügt werden. Ich habe dies geschafft, während ich UserStoreand mit Integer IDs vermieden habe.

using JobsLedger.DAL; 
using JobsLedger.Models.Identity; 
using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Identity; 
using Microsoft.Extensions.DependencyInjection; 
using System; 

namespace JobsLedger.Models.Seeding 
{ 
    public static class SeedAdminUser 
    { 
     public static async void EnsureAdminUserCreated(this IApplicationBuilder app) 
     { 
      var context = app.ApplicationServices.GetService<JobsDbContext>(); 
      if (context.AllMigrationsApplied()) 
      { 
       var userManager = app.ApplicationServices.GetService<UserManager<User>>(); 
       var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>(); 

       var user = new User 
       { 
        UserName = "Admin", 
        NormalizedUserName = "ADMIN", 
        Email = "[email protected]", 
        NormalizedEmail = "[email protected]", 
        EmailConfirmed = true, 
        LockoutEnabled = false, 
        SecurityStamp = Guid.NewGuid().ToString() 
       }; 

       var password = new PasswordHasher<User>(); 
       var hashed = password.HashPassword(user, "password"); 
       user.PasswordHash = hashed; 

       var result = await userManager.CreateAsync(user, user.PasswordHash); 

       var AdminUser = await userManager.FindByNameAsync("Admin"); 

       if (AdminUser != null) 
       { 
        if (roleManager.RoleExistsAsync("Admin").Result) 
        { 
         var RoleResult = await userManager.AddToRoleAsync(AdminUser, "Admin"); 
        } 
       } 
      } 
     } 
    } 
} 

ich auch diesen Eintrag in die StartUp.cs Klasse nach platziert "app.UseIdentity();":

app.EnsureAdminUserCreated(); 

... Models.Identity die "User" Klasse in ihm hat und deshalb ist es in "using" enthalten.

Sie werden auch die folgenden machen diese Arbeit hinzufügen müssen:

using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Identity; 
using Microsoft.Extensions.DependencyInjection; 
using System; 

Schließlich werden Sie Rollen müssen bereits gemäß der oben gestellte Frage hinzugefügt werden ..

Verwandte Themen