ASP.Net标识 - AddLogin userId变为null

时间:2014-02-16 17:35:48

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

我使用ASP.Net Identity并按预期工作,除非关联外部登录提供程序。

例如,当我调用Repository.UserManager.AddLogin()(或异步)时,我得到异常:

  

UserId字段是必需的。

调试时我确保将正确的userId传递给函数,我甚至硬编码了。

对于loginInfo,我尝试过Facebook和Google提供商。

enter image description here

在监视窗口中,我们可以看到我正确地为方法指定了用户ID,并且在监视窗口User.Id中具有正确的值,而userIdnull。< / p>

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

3 个答案:

答案 0 :(得分:2)

我设法通过重新安装(更新)对EntityFramework和Microsoft.AspNet.Identity的引用来解决此问题。

但是,这将与现有的CodeFirst迁移和数据库产生不兼容。

由于我的服务尚未生效,因此删除数据库并重新创建迁移对我来说不是问题,但它可能是已经运行的服务的交易破坏者。

我也做了什么,在函数onModelCreating中改变了IdentityModels.cs中的一行:

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

为:

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

答案 1 :(得分:1)

我认为您忘记将UserId属性分配给user.Logins中的user.Id

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

答案 2 :(得分:0)

您应该首先将用户保存为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"));