ASP.Net 未找到 OpenAuth 登录方法 System.Data.Entity.ModelConfiguration.EntityTypeConfiguration

ASP.Net OpenAuth login Method not found System.Data.Entity.ModelConfiguration.EntityTypeConfiguration

我正在尝试启用使用外部提供商的登录,特别是在 webform 应用程序中的 Facebook。

我正在使用 asp.net 4.5 C# 和 Entity Framework 6

本地帐户登录工作正常,但是当我尝试使用 facebook 帐户登录时出现以下两个错误:

1- 我第一次 运行 尝试登录:

未找到方法:'System.Data.Objects.ObjectContext System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()'。 [堆栈跟踪]

[MissingMethodException: Method not found: 'System.Data.Objects.ObjectContext System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()'.]
   Microsoft.AspNet.Membership.OpenAuth.EFOpenAuthMembershipDatabase.EnsureDatabaseCreated(DbContext db) +0
   Microsoft.AspNet.Membership.OpenAuth.EFOpenAuthMembershipDatabase.GetContext() +106
   Microsoft.AspNet.Membership.OpenAuth.EFOpenAuthMembershipDatabase.GetMembershipUserName(String providerName, String providerUserId, Boolean updateLastUsed) +207
   Microsoft.AspNet.Membership.OpenAuth.OpenAuthManager.Login(HttpContextBase context, String providerName, String providerUserId, Boolean createPersistentCookie) +285
   Microsoft.AspNet.Membership.OpenAuth.OpenAuth.Login(String providerName, String providerUserId, Boolean createPersistentCookie) +109

然后 2 - 每次我尝试 运行 再次使用 facebook 登录时:

未找到方法:'Void System.Data.Entity.ModelConfiguration.EntityTypeConfiguration'1.ToTable(System.String)' [堆栈跟踪]

[MissingMethodException: Method not found: 'Void System.Data.Entity.ModelConfiguration.EntityTypeConfiguration'1.ToTable(System.String)'.]
   Microsoft.AspNet.Membership.OpenAuth.Data.OpenAuthDbContext.OnModelCreating(DbModelBuilder modelBuilder) +0
   System.Data.Entity.DbContext.CallOnModelCreating(DbModelBuilder modelBuilder) +39
   System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder() +674
   System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +61
   System.Data.Entity.Internal.RetryLazy'2.GetValue(TInput input) +171
   System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +566
   System.Data.Entity.Internal.InternalContext.Initialize() +31
   System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +39
   System.Data.Entity.Internal.Linq.InternalSet'1.Initialize() +137
   System.Data.Entity.Internal.Linq.InternalSet'1.get_InternalContext() +38
   System.Data.Entity.Infrastructure.DbQuery'1.System.Linq.IQueryable.get_Provider() +99
   System.Linq.Queryable.Where(IQueryable'1 source, Expression'1 predicate) +83
   Microsoft.AspNet.Membership.OpenAuth.EFOpenAuthMembershipDatabase.GetMembershipUserName(String providerName, String providerUserId, Boolean updateLastUsed) +1486
   Microsoft.AspNet.Membership.OpenAuth.OpenAuthManager.Login(HttpContextBase context, String providerName, String providerUserId, Boolean createPersistentCookie) +285
   Microsoft.AspNet.Membership.OpenAuth.OpenAuth.Login(String providerName, String providerUserId, Boolean createPersistentCookie) +109
...]

两个错误都出现在 RegisterExternalLogin.aspx.cs 中的以下行(OpenAuth.Login() 方法):

if(OpenAuth.Login(authResult.Provider, authResult.ProviderUserId, createPersistentCookie: false))
        {
            RedirectToReturnUrl();
        }

authResult 对象具有正确的值,因此 facebook 身份验证工作正常。 OpenAuth.Login 方法在尝试写入数据库时​​出现问题,但我不明白是什么,因为我在调试错误时没有收到任何明确的详细信息。即使使用步进调试,我也会得到该方法的错误页面,除此之外什么也没有。

我安装了以下软件包:

<package id="DotNetOpenAuth.AspNet" version="4.1.4.12333" targetFramework="net45" />
<package id="DotNetOpenAuth.Core" version="4.1.4.12333" targetFramework="net45" />
<package id="DotNetOpenAuth.OAuth.Consumer" version="4.1.4.12333" targetFramework="net45" />
<package id="DotNetOpenAuth.OAuth.Core" version="4.1.4.12333" targetFramework="net45" />
<package id="DotNetOpenAuth.OpenId.Core" version="4.1.4.12333" targetFramework="net45" />
<package id="DotNetOpenAuth.OpenId.RelyingParty" version="4.1.4.12333" targetFramework="net45" />

以及 OWIN 的以下内容:

<package id="Microsoft.Owin" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.Facebook" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.Google" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.MicrosoftAccount" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.OpenIdConnect" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.Twitter" version="3.0.1" targetFramework="net45" />

因为在第一个错误的堆栈跟踪中提到了 OnModelCreating 方法,这里是:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // This needs to go before the other rules!

        modelBuilder.Entity<User>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims").Property(p => p.Id).HasColumnName("UserClaimId");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles").Property(p => p.Id).HasColumnName("RoleId");
        modelBuilder.Ignore<IdentityUser>();
    }

问题出在包中

Microsoft.AspNet.Membership.OpenAuth

那是版本 1.0.1 升级到版本 2 它解决了使用外部帐户提供商登录的问题。 可能版本 1 中存在导致与 Entity Framework 6 冲突的错误,如此处报告:https://connect.microsoft.com/VisualStudio/feedback/details/811035/microsoft-aspnet-membership-openauth-is-not-compatible-with-entity-framework

这样做会导致项目出现无限其他问题,因为我正在使用 Microsoft.AspNet.Identity。* 并且身份和成员身份不兼容。

所以我删除了与 Microsoft.AspNet.Identity 相关的所有内容,更改了用户、角色、成员资格等表的数据库模式。 现在一切正常。