.Net Core 2.0 Identity Framework自定义角色注入

时间:2018-03-27 13:41:17

标签: c# asp.net-core asp.net-core-2.0 asp.net-core-identity

我只想将我的自定义实现应用于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();
    }

它给我的错误是: enter image description here

显然它试图将CcrRole转换为IRoleStore。但它不是商店。我不知道为什么期望在AddRoles方法上使用RoleStore。 知道为什么吗?感谢名单。

编辑:

我想将用户存储注入我的控制器。但在这样做时,我不想传递所有thoose泛型类型。我只想在这种情况下使用我的CustomUserStore CcrUserStore。当我键入thoose泛型时,我可以运行应用程序,但是当我想注入我的自定义用户时,它会让我感到厌倦。

这是我的控制器: enter image description here

和我的自定义用户存储: enter image description here

1 个答案:

答案 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