我只想将我的自定义实现应用于IdentityUser和IdentityRole。
这是我的角色
public class CcrRole : IdentityRole<int>
{
}
这是我的自定义用户实现
public class CcrUser : IdentityUser<int>
{
public EntityStatus EntityStatus { get; set; }
public string AvatarPath { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string FullName { get; set; }
public DateTime CreatedDate { get; set; }
}
这是我的DbContext:
public class CcrDbContext : IdentityDbContext<CcrUser, CcrRole, int>
{
public CcrDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet<AnnualPermit> AnnualPermits { get; set; }
}
当我运行它时这是我的ConfigureServices方法。我只想定义我的角色是CcrRole。不是IdentityRole。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextPool<CcrDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("AppDbConnection")));
services
.AddIdentity<CcrUser, CcrRole>(t =>
{
t.User.RequireUniqueEmail = true;
})
.AddRoles<CcrRole>()
.AddUserStore<CcrUserStore>()
.AddDefaultTokenProviders();
}
显然它试图将CcrRole转换为IRoleStore。但它不是商店。我不知道为什么期望在AddRoles方法上使用RoleStore。 知道为什么吗?感谢名单。
我想将用户存储注入我的控制器。但在这样做时,我不想传递所有thoose泛型类型。我只想在这种情况下使用我的CustomUserStore CcrUserStore。当我键入thoose泛型时,我可以运行应用程序,但是当我想注入我的自定义用户时,它会让我感到厌倦。
答案 0 :(得分:1)
我无法重现您遇到的同样问题。
但是,我认为问题的一个重要根本原因可能是AddUserStore
方法的泛型类型参数是User
类型,而不是UserStore
的类型(请参阅{{ 3}})。从2.1开始,此扩展已更改为接受UserStore作为类型参数。因此,如果您想/需要添加自己的UserStore
,可以按如下方式设置DI:
services
.AddIdentity<CcrUser, CcrRole>(t =>
{
t.User.RequireUniqueEmail = true;
})
.AddDefaultTokenProviders();
services.AddScoped<IUserStore<CcrUser>, CcrUserStore>();
然后,您需要更改AnnualPermitController
构造函数的签名,如下所示:
public AnnualPermitController(CcrDbContext context, IUserStore<CcrUser> userStore)
: base(options)
{
//...
}
然而,尽管如此,我认为创建自定义UserStores非常罕见。您可能想要一个非常具体和重要的要求,以便想要创建自己的UserStore
。