繁体   English   中英

在身份 Asp.net 核心 3 MVC 中创建服务 IUserStore 时出错

[英]Error in Service IUserStore being created in Identity Asp.net core 3 MVC

更新

请参阅下面的更新。

我最近问过一个以前的stackoverflow问题,但是在从以下两个地方实施建议的解决方案后我遇到了一个问题ASP.NET 核心中的身份 model 自定义和 Z9E0DA8438E1E38A1C30F4B76CE73 身份的自定义存储提供程序 我只是无法让解决方案发挥作用。 我已经按照建议实现了IdentityUser的扩展和IdentityRole的扩展。 我已经为UserStore实现了IUserPasswordStoreIUserRoleStoreIUserStore ,我已经为RoleStore IRoleStore 我还实现了实现IdentityDbContext的新 dbContext ApplicationDbContext 构造函数不接受参数存在问题,因此我实现了一个新的构造函数。 我不确定这是否正确。

然而,这似乎无关紧要,因为我在调用时 Program.cs 的 Main 方法中出现错误

CreateHostBuilder(args).Build().Run(); 

而且误差很大。 我已经把它放在最后了。 在线搜索错误的部分并没有提供任何关于我在做什么的想法,而且由于我是 ASP.NET Core 3 和 Identity 的新手,我很难过。

这是我到目前为止的代码。

配置服务方法

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        options.EnableEndpointRouting = false;
        });

        services.AddDbContext<EntitiesModel>(options => options.UseSqlServer(
            Configuration["Data:ConnectionStrings:XXXXDbConnection"]));
        services.AddIdentity<UserViewModel,RoleViewModel>().AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders().AddRoles<RoleViewModel>(); ;
        services.AddTransient<IUserStore<UserViewModel>, UserStore>();
        services.AddTransient<IRoleStore<RoleViewModel>, RoleStore>();
        services.ConfigureApplicationCookie(options =>
        {
            options.LoginPath = "/Login";
            options.LogoutPath = "/Logout";
        });
    }

ApplicationDbContext - 这些都在同一个命名空间中

public class IdentityDbContext
    : IdentityDbContext<IdentityUser, IdentityRole, string>
{
    public IdentityDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
}

public class IdentityDbContext<TUser>
    : IdentityDbContext<TUser, IdentityRole, string>
    where TUser : IdentityUser
{
    public IdentityDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
}

// Uses the built-in Identity types except with custom User and Role types
// The key type is defined by TKey
public class IdentityDbContext<TUser, TRole, TKey> : IdentityDbContext<
    TUser, TRole, TKey, IdentityUserClaim<TKey>, IdentityUserRole<TKey>,
    IdentityUserLogin<TKey>, IdentityRoleClaim<TKey>, IdentityUserToken<TKey>>
    where TUser : IdentityUser<TKey>
    where TRole : IdentityRole<TKey>
    where TKey : IEquatable<TKey>
{
    private DbContextOptions<ApplicationDbContext> options;
    //private string nameOrConnectionString;

    public IdentityDbContext(DbContextOptions<ApplicationDbContext> options)
    {
        this.options = options;
    }

}

public abstract class IdentityDbContext<
        TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>
    : IdentityUserContext<TUser, TKey>
    where TUser : IdentityUser<TKey>
    where TRole : IdentityRole<TKey>
    where TKey : IEquatable<TKey>
    where TUserRole : IdentityUserRole<TKey>
{

}
public class ApplicationDbContext : IdentityDbContext<UserViewModel,RoleViewModel,int>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

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

        modelBuilder.Entity<UserViewModel>(b =>
        {               
            b.HasMany(e => e.UserRoles)
                .WithOne()
                .HasForeignKey(ur => ur.Id)
                .IsRequired();
        });
        modelBuilder.Entity<UserViewModel>(b =>
        {
            b.ToTable("T_CustomerContacts");
        });
        modelBuilder.Entity<RoleViewModel>(b =>
        {
            b.ToTable("T_LoginRoles");
        });
        modelBuilder.Entity<UserRoleViewModel>(b =>
        {
            b.ToTable("T_CustomerContactRole");
        });         
        modelBuilder.Entity<RoleViewModel>(b =>
        {
            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.Role)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();
        });
    }
}

用户视图模型

public class UserViewModel : IdentityUser<int>
{

用户角色视图模型

public class UserRoleViewModel : IdentityUserRole<int>
{

角色视图模型

public class RoleViewModel : IdentityRole<int>
{   

角色存储

public class RoleStore : IRoleStore<RoleViewModel>
{

用户存储

public class UserStore : IUserStore<UserViewModel>, IUserPasswordStore<UserViewModel>, IUserRoleStore<UserRoleViewModel>
{

我必须补充一点,这是我尝试过的最终配置。 我尝试了许多组合和解决方案。 部分错误如下

启动应用程序时发生错误。 AggregateException:无法构造某些服务(验证服务描述符时出错'ServiceType:Microsoft.AspNetCore.Identity.IUserStore 1[TrussCorp.CustomerPortal.Models.ViewModel.Identity.UserViewModel] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore 4 [TrussCorp.CustomerPortal.Models.ViewModel.Identity.UserViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.RoleViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.ApplicationDbContext,System.Int32]':无法在尝试激活 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore 4[TrussCorp.CustomerPortal.Models.ViewModel.Identity.UserViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.RoleViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.ApplicationDbContext,System.Int32]'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IRoleStore 4[TrussCorp.CustomerPortal.Models.ViewModel.Identity.UserViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.RoleViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.ApplicationDbContext,System.Int32]'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IRoleStore 1[TrussCorp.CustomerPortal.Models.ViewModel.Identity.RoleViewModel] 生命周期:Scoped ImplementationType:Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore 3[TrussCorp.CustomerPortal.Models.ViewModel.Identity.RoleViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.ApplicationDbContext,System.Int32]': Unable to resolve service for type 'TrussCorp.CustomerPortal.Models.ViewModel.Identity.ApplicationDbContext' while attempting to activate 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore 3[TrussCorp.CustomerPortal.Models.ViewModel.Identity.RoleViewModel,TrussCorp.CustomerPortal.Models.ViewModel.Identity.ApplicationDbContext,System.Int32]'.) Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable serviceDescriptors、ServiceProviderOptions 选项)

更新

我回到了从上一个问题开始的地方,但是通过颠倒以下顺序解决了上述错误

    services.AddTransient<IUserStore<UserViewModel>, UserStore>();
        services.AddTransient<IRoleStore<RoleViewModel>, TrussCorp.CustomerPortal.Identity.RoleStore>();
        services.AddIdentity<UserViewModel,RoleViewModel>().AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders().AddRoles<RoleViewModel>();

但正如现在所说,我得到的Store 没有实现 IUserRoleStore UserManager.GetUserRoleStore()错误,这让我回到了原点。

我对其他开发人员的建议是,如果您在互联网上找不到类似的问题,那么您正在做一些愚蠢而独特的事情。

解决方案是改变这个

public class UserStore : IUserStore<UserViewModel>, IUserPasswordStore<UserViewModel>, IUserRoleStore<UserRoleViewModel>
{

对此

public class UserStore : IUserStore<UserViewModel>, IUserPasswordStore<UserViewModel>, IUserRoleStore<UserViewModel>
{

您可以尝试将其添加到顶部吗?

services.AddIdentity<UserViewModel,RoleViewModel>().AddUserStore<UserStore>().AddRoleStore<RoleStore>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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