我使用ASP.Net Identity并按预期工作,除非关联外部登录提供程序。
例如,当我调用Repository.UserManager.AddLogin()
(或异步)时,我得到异常:
UserId字段是必需的。
调试时我确保将正确的userId
传递给函数,我甚至硬编码了。
对于loginInfo
,我尝试过Facebook和Google提供商。
在监视窗口中,我们可以看到我正确地为方法指定了用户ID,并且在监视窗口User.Id
中具有正确的值,而userId
是null
。< / p>
不幸的是Codeplex上的源代码尚未公开,因此我无法查看实现。
答案 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"));