Asp.net 身份验证错误

Posted

技术标签:

【中文标题】Asp.net 身份验证错误【英文标题】:Asp.net Identity Validation Error 【发布时间】:2013-11-28 11:06:57 【问题描述】:

我想将 IdentityContext 与 mydbcontext 集成,但我遇到了这个错误

在模型生成过程中检测到一个或多个验证错误:

Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin: : EntityType 'IdentityUserLogin' 没有定义键。定义此 EntityType 的键。 Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole: : EntityType 'IdentityUserRole' 没有定义键。定义此 EntityType 的键。 IdentityUserLogins:EntityType:EntitySet 'IdentityUserLogins' 基于没有定义键的类型'IdentityUserLogin'。 IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' 基于没有定义键的类型'IdentityUserRole'。

我该如何解决这个问题?

代码:

 public partial class ivdbDb156978Context : IdentityDbContext<ApplicationUser> 

    static ivdbDb156978Context()
    
        Database.SetInitializer<ivdbDb156978Context>(null);
    

    public ivdbDb156978Context()
        : base("Name=ivdbContext")
    
    


    public DbSet<Car> Cars  get; set; 

应用用户

    public class ApplicationUser : IdentityUser



【问题讨论】:

【参考方案1】:

您的代码没有显示这一点,但根据您收到的错误,我假设您正在覆盖 OnModelCreating。这是 IdentityDbContext&lt;ApplicationUser&gt; 配置实体框架映射的地方。这意味着,如果您想覆盖 OnModelCreating,您需要调用 base 或者您必须自己进行映射。

所以要么这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);

    // your stuff here

或者你做映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new  r.RoleId, r.UserId );

【讨论】:

我确信我可以在需要时在 *** 中找到有关 EF Code First 方法的正确答案。谢谢 我在 OnModelCreating 上创建了一个覆盖,所以我可以添加 modelBuilder.Conventions.Remove();以防止 EF 使我的表名复数,这让我在第一次尝试添加迁移时感到困惑。感谢您非常有帮助的回答奥拉夫 你好 Olav,这解决了我没有定义键的错误,但现在我收到了许多无效的列名错误。我在这里发帖***.com/questions/23346422/…。您对此有何见解。谢谢你,乔 base.OnModelCreating(modelBuilder);为我工作,我有现有的用户,所以不想做任何激进的事情。谢谢奥拉夫 复制粘贴一些 AppHarbor 的文档代码后出现此错误。谢谢!【参考方案2】:

如果您不想调用 base.OnModelCreating 并希望自己进行映射,您的映射应如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id).Property(p => p.Name).IsRequired();
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new  r.RoleId, r.UserId );
    modelBuilder.Entity<IdentityUserLogin>().HasKey(u => new u.UserId, u.LoginProvider, u.ProviderKey);

如果您仅将 IdentityUserLogin 的密钥放在 UserId 上,则在使用默认的 google 登录时会出现 DbEntityValidationExceptions。

【讨论】:

【参考方案3】:

关键是你不能有一个空的 OnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder)

  base.OnModelCreating(modelBuilder);
  // your stuff here

不好

protected override void OnModelCreating(DbModelBuilder modelBuilder)

  // base.OnModelCreating(modelBuilder);
  // your stuff here

【讨论】:

以上是关于Asp.net 身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章

JWT 身份验证始终返回 401 HTTP 错误 asp.net core

ASP.NET Core JWT/Windows 身份验证 HTTP 400 错误

Thingsboard - REST API 上的身份验证错误(来自 Curl 命令和 ASP.NET)

ASP.NET Core API 使用 JWT 不记名令牌进行身份验证

ASP.NET Core JWT 身份验证以保护 webAPI [Authorize] 属性错误 401 Unauthorized

没有 ASP.NET 身份的 .NET Core 外部身份验证