简体   繁体   中英

Can't inherit from IdentityUser and IdentityRole in ASP.NET Core 2.0

I'm trying to finish updating to .NET Core 2.0 but a couple of errors pop up:

The problem:

I have two classes, ApplicationRole and ApplicationUser which inherit some properties from IdentityRole and IdentityUser.

With the update to Core 2.0 I'm getting the following errors, claiming that IdentityRole and IdentityUser could not be found.

However, the package Microsoft.AspNetCore.Identity.EntityFrameworkCore 2.0 is installed in the new version of .NET Core

About IdentityRole:

Message 1:

The type or namespace name 'IdentityRole' could not be found (is it missing a using directive or an assembly reference?)

Message 2:

The 'Application.Models.ApplicationRole' type can not be used as a parameter of type 'TRole' in the generic type or method 'IdentityDbContext '. There is no implicit reference conversion from 'Application.Models.ApplicationRole' to 'Microsoft.AspNetCore.Identity.IdentityRole '.

Definition of ApplicationRole:

public class ApplicationRole:IdentityRole
{
    public string Description { get; set; }
    public DateTime CreatedDated { get; set; }
    public string IPAddress { get; set; }
}

About IdentityUser:

Message 1:

The type or namespace name 'IdentityUser' could not be found (is it missing a using directive or an assembly reference?)

Message 2:

The 'Application.Models.ApplicationUser' type can not be used as a parameter of type 'TUser' in the generic type or method 'IdentityDbContext '. There is no implicit reference conversion from 'Application.Models.ApplicationUser' to 'Microsoft.AspNetCore.Identity.IdentityUser '.

Definition of ApplicationUser

public class ApplicationUser:IdentityUser
{
    public string Name { get; set; }
}

The guide followed to define this classes and their use are here:

http://www.c-sharpcorner.com/article/asp-net-core-mvc-authentication-and-role-based-authorization-with-asp-net-core/

With the change to Core 2.0 I wonder how IdentityRole and IdentityUser changed so I can no longer inherit from them.

Solved.

The package that was keeping those classes Microsoft.AspNetCore.Identity.EntityFrameworkCore changed. To access those clases ( IdentityUser and IdentityRole ) one must add

using Microsoft.AspNetCore.Identity;

With this, the problem is gone.

ICollection<IdentityUserRole<int>> Roles , ICollection<IdentityUserClaim<int>> Claims and ICollection<IdentityUserLogin<int>> Logins navigation properties have been removed from Microsoft.AspNetCore.Identity.IdentityUser .

You should define them manually

public class MyUser : IdentityUser
{                
    public virtual ICollection<IdentityUserRole<int>> Roles { get; } = new List<IdentityUserRole<int>>();

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

    public virtual ICollection<IdentityUserLogin<int>> Logins { get; } = new List<IdentityUserLogin<int>>();
}

To prevent duplicate foreign keys when running EF Core Migrations, add the following to your IdentityDbContext class' OnModelCreating method

protected override void OnModelCreating(ModelBuilder builder)
{
  base.OnModelCreating(builder);

builder.Entity<MyUser>()
    .HasMany(e => e.Claims)
    .WithOne()
    .HasForeignKey(e => e.UserId)
    .IsRequired()
    .OnDelete(DeleteBehavior.Cascade);

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

builder.Entity<MyUser>()
    .HasMany(e => e.Roles)
    .WithOne()
    .HasForeignKey(e => e.UserId)
    .IsRequired()
    .OnDelete(DeleteBehavior.Cascade);
}

Migrating Authentication and Identity to ASP.NET Core 2.0

对我来说,它通过安装包解决了:

Microsoft.Extensions.Identity.Stores

This happen to me but I was using Asp.net Core with traditional .NET Framework. You need to add the Nuget package Microsoft.Extensions.Identity . That contains the classes IdentityUser and IdentityRole .

I think the reason you have to add this is when your project isn't using the Microsoft.AspNetCore.All package.

You need to install Microsoft.AspNetCore.Identity.EntityFramework package

Install-Package Microsoft.AspNetCore.Identity.EntityFramework

or

dotnet add package Microsoft.AspNetCore.Identity.EntityFramework

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM