尝试在 ASP.NET Core 2.0 中实现 Identity。我在解决这个问题时遇到很多问题。
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Ctrack6_Custom"))
);
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
etc...
ApplicationUser.cs 使用 Guid 作为密钥。也在角色等中设置
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser<Guid>
{
[MaxLength(50)]
public string FirstName { get; set; }
[MaxLength(50)]
public string LastName { get; set; }
[MaxLength(5)]
public string OrgCode { get; set; }
public ApplicationUser() : base()
{
}
}
ApplicationDbContext.cs 此文件中的类定义会引发错误。 ApplicationDbContext 抛出此错误:
类型“App.Identity.ApplicationUser”不能用作泛型类型或方法“IdentityDbContext”中的类型参数“TUser”。没有从“App.Identity.ApplicationUser”到“Microsoft.AspNetCore.Identity.IdentityUser”的隐式引用转换。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
builder.Entity<blah>()
.HasKey(c => new { fields, for, key });
}
public DbSet<etc> Etcs {get; set; }
}
改变
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
到
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
您需要有一个与 ApplicationUser 类类似的 ApplicationRole 类。据我所知,一旦您指定了密钥类型(在本例中为 Guid,默认为字符串),即使您不使用角色,您也需要包含角色和密钥类型。
我遇到了这个问题,最后意识到这是因为我的愚蠢错误。确保 IdentityUser 源自包 Microsoft.AspNetCore.Identity 而不是 Microsoft.AspNet.Identity.Core
这对我有用:
public class DataContext : IdentityDbContext<ApplicationUser,IdentityRole<Guid>,Guid>
我通过意外删除 ApplicationUser 的类定义中的继承而得到了同样的错误:
public class ApplicationUser : IdentityUser
{
...
}
我已将包名称从 Microsoft.AspNet.Identity 更改为 Microsoft.AspNetCore.Identity 并且它有效。