C# ASP.Net标识-AddLogin用户标识变为空
我使用ASP.Net标识,它可以按预期工作,但与外部登录提供程序关联时除外 例如,当我调用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 遗憾的是,源代码尚
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"));