2017-10-03 6 views
0

Ich habe an einer Webanwendung gearbeitet, die angular universal und asp.net core mit OpenIDDict token auth verwendet.Asp.net Core 2.0 Upgrade Probleme mit IdentityRole und IdentityUser

Ich habe benutzerdefinierte Rollen und Ansprüche/Berechtigungen. Ich habe viel Code von einem früheren Projekt genommen, das für asp.net core 1.1 geschrieben wurde, und als solches musste ich Erweiterungen zu IdentityUser und IdentityRole erstellen, die ich gemäß den Microsoft-Dokumenten aktualisierte, einschließlich der Navigationseigenschaften, wie unten gezeigt, Mein Problem ist, dass wenn ich die Rollen vom Db bekomme und User und Claims z

_context.Roles 
      .Include(r => r.Claims) 
      .Include(r => r.Users) 
      .OrderBy(r => r.Name); 

ich die Rollen bekommen, aber der Benutzer und der Anspruch Zahl 0, so irgendwo nicht aktualisiert etwas, das gleiche passiert, wenn der Benutzer über Usermanager bekommen, erhalte ich eine 0 Rollen und 0 Ansprüche! Wenn ich den Rollenmanager zum Überprüfen der Benutzerrollen verwende, funktioniert es und gibt die Rollen zurück. Ich habe meinen dbContext auch unten eingefügt. Hoffentlich ist es eine einfache Lösung!

ApplicationRole:

public class ApplicationRole : IdentityRole 
    { 

    public ApplicationRole() 
    { 

    } 
    public virtual ICollection<ApplicationRoleClaim> Claims { get; set; } = new List<ApplicationRoleClaim>(); 
    public virtual ICollection<ApplicationUser> Users { get; set; } = new List<ApplicationUser>(); 

    public ApplicationRole(string roleName) : base(roleName) 
    { 

    } 


    public ApplicationRole(string roleName, string description) : base(roleName) 
    { 
     Description = description; 
    } 






    public string Description { get; set; } 
    } 

ApplicationUser:

public class ApplicationUser : IdentityUser 
    { 
    public virtual string FriendlyName 
    { 
     get 
     { 
     string friendlyName = string.IsNullOrWhiteSpace(FullName) ? UserName : FullName; 

     if (!string.IsNullOrWhiteSpace(JobTitle)) 
      friendlyName = JobTitle + " " + friendlyName; 

     return friendlyName; 
     } 
    } 


    public string JobTitle { get; set; } 
    public string FullName { get; set; } 
    public string Configuration { get; set; } 
    public bool IsEnabled { get; set; } 
    public bool IsLockedOut => this.LockoutEnabled && this.LockoutEnd >= DateTimeOffset.UtcNow; 


    public virtual ICollection<IdentityUserRole<string>> Roles { get; } = new List<IdentityUserRole<string>>(); 


    public virtual ICollection<IdentityUserClaim<string>> Claims { get; } = new List<IdentityUserClaim<string>>(); 


    public virtual ICollection<IdentityUserLogin<string>> Logins { get; } = new List<IdentityUserLogin<string>>(); 
    //public ICollection<Order> Orders { get; set; } 
    } 

ApplicationRoleClaim:

public class ApplicationRoleClaim : IdentityRoleClaim<string> 
    { 

    public virtual ApplicationRole ApplicationRole { get; set; } 

    } 

DbContext:

public class MYDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string> 
    { 
     public MyDbContext(DbContextOptions<MyDbContext> options) 
      : base(options) 
     { 
      Database.EnsureCreated(); 
     } 

     //List of DB Models - Add your DB models here 
     public DbSet<Customer> Customers { get; set; } 
     public DbSet<Product> Product { get; set; } 
     public virtual DbSet<OpenIddictApplication> OpenIddictApplication { get; set; } 
     public virtual DbSet<OpenIddictAuthorization> OpenIddictAuthorization { get; set; } 
     public virtual DbSet<OpenIddictScope> OpenIddictScope { get; set; } 
     public virtual DbSet<OpenIddictToken> OpenIddictToken { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Product>() 
      .Property(b => b.EntryTime) 
      .HasDefaultValueSql("getdate()"); 

     base.OnModelCreating(modelBuilder); 
     modelBuilder.UseOpenIddict(); 
     modelBuilder.Entity<ApplicationRoleClaim>() 
      .HasOne(pt => pt.ApplicationRole) 
      .WithMany(t => t.Claims) 
      .HasForeignKey(pt => pt.RoleId); 
     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Claims) 
      .WithOne() 
      .HasForeignKey(e => e.UserId) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Logins) 
      .WithOne() 
      .HasForeignKey(e => e.UserId) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Roles) 
      .WithOne() 
      .HasForeignKey(e => e.UserId) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<ApplicationRole>() 
    .HasMany(t => t.Claims) 
    .WithOne(r => r.ApplicationRole) 
    .HasForeignKey(pt => pt.RoleId); 

    } 
    } 

EDIT:

Ich habe festgestellt, dass ich die Rollen zählen mit dem Benutzer jetzt; Ich kann jedoch die Anzahl der Benutzer mit den Rollen nicht abrufen. Ich habe versucht, Rollen mit Benutzern zu verknüpfen, bekam aber Fehler. Ich habe es geschafft, Forderungen und Rollen zu verknüpfen:

modelBuilder.Entity<ApplicationRole>() 
    .HasMany(r => r.Claims) 
    .WithOne() 
    .HasForeignKey(c => c.RoleId).IsRequired() 
    .OnDelete(DeleteBehavior.Cascade); 

Antwort

0

repariert es!

meine nav Eigenschaften geändert entsprechen: applicationuser:

public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } 


public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; } 

ApplicationRole:

public virtual ICollection<IdentityUserRole<string>> Users { get; set; } 

public virtual ICollection<IdentityRoleClaim<string>> Claims { get; set; } 

aktualisiert meine DbContext:

modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Claims).WithOne().HasForeignKey(c => c.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade); 
    modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Roles).WithOne().HasForeignKey(r => r.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade); 

    modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Claims).WithOne().HasForeignKey(c => c.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade); 
    modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Users).WithOne().HasForeignKey(r => r.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade); 

die anfängliche Migration ok sah Sichergestellt. und alles hat funktioniert.

Verwandte Themen