C# ASP.Net标识-AddLogin用户标识变为空

C# ASP.Net标识-AddLogin用户标识变为空,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,我使用ASP.Net标识,它可以按预期工作,但与外部登录提供程序关联时除外 例如,当我调用Repository.UserManager.AddLogin()(或Async)时,会出现异常: UserId字段是必需的 在调试过程中,我确保向函数传递了正确的userId,甚至对其进行了硬编码 对于loginInfo,我尝试了Facebook和谷歌提供商 在监视窗口中,我们可以看到我正确地为方法指定了用户ID,并且在监视窗口中,user.ID具有正确的值,而userId为null 遗憾的是,源代码尚

我使用ASP.Net标识,它可以按预期工作,但与外部登录提供程序关联时除外

例如,当我调用
Repository.UserManager.AddLogin()
(或Async)时,会出现异常:

UserId字段是必需的

在调试过程中,我确保向函数传递了正确的
userId
,甚至对其进行了硬编码

对于
loginInfo
,我尝试了Facebook和谷歌提供商

在监视窗口中,我们可以看到我正确地为方法指定了用户ID,并且在监视窗口中,
user.ID
具有正确的值,而
userId
null


遗憾的是,源代码尚未在Codeplex上公开,因此我无法查看实现。

我通过重新安装(更新)对EntityFramework和Microsoft.AspNet.Identity的引用,成功地解决了此问题

但是,这将导致与现有CodeFirst迁移和数据库不兼容

因为我的服务还没有上线,所以删除数据库并重新创建迁移对我来说不是问题,但是对于已经运行的服务来说,这可能是一个破坏者

我还做了一件事,就是在ModelCreating上的函数IdentityModels.cs中更改了一行:

modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity().HasKey(l=>l.UserId);
致:

modelBuilder.Entity().HasKey(l=>new{l.UserId,l.LoginProvider,l.ProviderKey});

我想您忘了将UserId属性分配给user.Logins中的user.Id

        user.Logins.Add(new IdentityUserLogin
        {
            LoginProvider = externalLogin.LoginProvider,
            ProviderKey = externalLogin.ProviderKey,
            UserId=user.Id
        });

您应首先将用户另存为ApplicationUser:

var user = new ApplicationUser() { Id = User.Identity.GetUserId(), UserName = "user", Email = "user@domain.com" };
IdentityResult result = await UserManager.CreateAsync(user);
然后,您可以创建登录记录:

result = await UserManager.AddLoginAsync(user.Id, new UserLoginInfo("loginProvider", "providerKey"));

在硬编码该值之前,您的代码是什么?在硬编码
userId
之前,该值是
User.Identity.GetUserId()
。我将该方法移动到我的业务层,该方法是从
控制器调用的
您找到解决方案了吗?我遇到了同样的问题。@jt234不幸的是没有
result = await UserManager.AddLoginAsync(user.Id, new UserLoginInfo("loginProvider", "providerKey"));