Asp.net mvc 具有外部登录名的MVC 5标识的用户登录名始终为0

Asp.net mvc 具有外部登录名的MVC 5标识的用户登录名始终为0,asp.net-mvc,facebook,asp.net-identity-3,Asp.net Mvc,Facebook,Asp.net Identity 3,我有一个MVC5网站运行的身份与外部登录。我只是稍微修改了一下,把f/l名称和用户名与电子邮件分开 我没有注册新用户,我只是通过Fackbook登录。。。(这可能就是问题所在?) 如果我通过Facebook登录,它会在身份表中创建一个用户(但不会创建密码散列) 但是,当我导航到“管理”控制器时,它会显示 外部登录:0[管理] 当我点击“管理”时,它会带我进入“管理/管理登录”,并显示一个Facebook按钮。。。但单击FB按钮后,我得到了“出现错误” 查看managecontroller,我看到

我有一个MVC5网站运行的身份与外部登录。我只是稍微修改了一下,把f/l名称和用户名与电子邮件分开

我没有注册新用户,我只是通过Fackbook登录。。。(这可能就是问题所在?) 如果我通过Facebook登录,它会在身份表中创建一个用户(但不会创建密码散列)

但是,当我导航到“管理”控制器时,它会显示

外部登录:0[管理]

当我点击“管理”时,它会带我进入“管理/管理登录”,并显示一个Facebook按钮。。。但单击FB按钮后,我得到了“出现错误”

查看managecontroller,我看到这个方法受到了攻击,它在哪里收集用户登录,它没有得到任何

 // GET: /Manage/ManageLogins
    public async Task<ActionResult> ManageLogins(ManageMessageId? message)
    {
        ViewBag.StatusMessage =
            message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
            : message == ManageMessageId.Error ? "An error has occurred."
            : "";
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user == null)
        {
            return View("Error");
        }
    --> var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId()); <-- here it doesn't get any
        var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
        ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
        return View(new ManageLoginsViewModel
        {
            CurrentLogins = userLogins,
            OtherLogins = otherLogins
        });
    }
这会引起什么问题吗?用这句话把身份从盒子里装出来似乎很奇怪。。(尽管谈论很多)

编辑: 我注意到,在“IdentityUserLogins”表中,它显示了一个“Facebook”的登录提供者,用户ID是我的用户。。但是,ApplicationSerID字段为空。。将用户标识放入此字段后,“删除”按钮将显示在管理页面中。。。。 我错过了什么? 如何不输入ApplicationSerID?。。默认标识的另一个修复程序?

我已经将我的身份模型转移到了一个独立于web项目的“数据”项目中。这个帖子里的人也有一个类似的问题,他的Id也是空的。对fluentapi和voila稍作修改

var user = modelBuilder.Entity<TUser>()
.ToTable("AspNetUsers");
user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
user.Property(u => u.UserName).IsRequired();

modelBuilder.Entity<TUserRole>()
.HasKey(r => new { r.UserId, r.RoleId })
.ToTable("AspNetUserRoles");

modelBuilder.Entity<TUserLogin>()
.HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey})
.ToTable("AspNetUserLogins");

modelBuilder.Entity<TUserClaim>()
.ToTable("AspNetUserClaims");

var role = modelBuilder.Entity<TRole>()
.ToTable("AspNetRoles");
role.Property(r => r.Name).IsRequired();
role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);
var user=modelBuilder.Entity()
.ToTable(“AspNetUsers”);
user.HasMany(u=>u.Roles).WithRequired().HasForeignKey(ur=>ur.UserId);
user.HasMany(u=>u.Claims).WithRequired().HasForeignKey(uc=>uc.UserId);
user.HasMany(u=>u.Logins).WithRequired().HasForeignKey(ul=>ul.UserId);
属性(u=>u.UserName).IsRequired();
modelBuilder.Entity()
.HasKey(r=>new{r.UserId,r.RoleId})
.ToTable(“AspNetUserRoles”);
modelBuilder.Entity()
.HasKey(l=>new{l.UserId,l.LoginProvider,l.ProviderKey})
.ToTable(“AspNetUserLogins”);
modelBuilder.Entity()
.ToTable(“AspNetUserClaims”);
var role=modelBuilder.Entity()
.ToTable(“AspNetRoles”);
属性(r=>r.Name).IsRequired();
role.HasMany(r=>r.Users).WithRequired().HasForeignKey(ur=>ur.RoleId);

我敢于做出如下改变,效果非常好:

//modelBuilder.Entity<IdentityUser>().ToTable("Usuario", "dbo");
 var user = modelBuilder.Entity<IdentityUser>()
           .ToTable("Usuario", "dbo");

            user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
//modelBuilder.Entity().ToTable(“Usuario”、“dbo”);
var user=modelBuilder.Entity()
.ToTable(“Usuario”、“dbo”);
user.HasMany(u=>u.Logins).WithRequired().HasForeignKey(ul=>ul.UserId);

如果用户使用本地(非外部)帐户登录,那么
GetLoginsAsync
是否应该返回0次登录?我不知道。好问题。
//modelBuilder.Entity<IdentityUser>().ToTable("Usuario", "dbo");
 var user = modelBuilder.Entity<IdentityUser>()
           .ToTable("Usuario", "dbo");

            user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);