0

在过去的几个小时里,我一直在尝试在我的 MVC 4 网站中添加 facebook 登录。

到目前为止,“本地帐户注册”( WebSecurity.CreateAccount() 运行良好。

在我的业务逻辑中,我的代码如下所示:

public ValidationReturn<User> AddUser(User data, string provider, string providerUserId)
{
....

Repository.Insert(data);
SaveChanges();

OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, data.LoginName);

现在,当我尝试创建这样的帐户时, OAuthWebSecurity.CreateOrUpdateAccount 抛出异常:

INSERT 语句与 FOREIGN KEY 约束“FK_dbo.webpages_OAuthMembership_dbo.webpages_Membership_UserId”冲突。冲突发生在数据库“Wims”、表“dbo.webpages_Membership”、列“UserId”中。

我在我的 UserTable 中看到我的用户,并且我了解查看 db 方案为什么它崩溃......但我不知道原因...... OAuthWebSecurity.CreateOrUpdateAccount 是否也应该在 pages_Membership 中创建记录?如果是这样,密码呢?

我一直在网上查看几个这样的教程: http ://www.asp.net/mvc/tutorials/mvc-4/using-oauth-providers-with-mvc或http://www.asp。 net/web-pages/tutorials/security/16-adding-security-and-membership ,我看不出我在这里缺少什么...

谢谢你的时间。

4

2 回答 2

0

对我来说,我发现会员模型的代码在 OAuthMembership 上有一个外键,返回到 Membership 表。这是不正确的,因为您可以使用 OAuthMembership 登录,而无需本地成员资格记录。我不得不注释掉以下几行:

[Table("webpages_Membership")]
public class Membership
{
    public Membership()
    {
        Roles = new List<Role>();
        //OAuthMemberships = new List<OAuthMembership>();
    }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }
    public DateTime? CreateDate { get; set; }
    [StringLength(128)]
    public string ConfirmationToken { get; set; }
    public bool? IsConfirmed { get; set; }
    public DateTime? LastPasswordFailureDate { get; set; }
    public int PasswordFailuresSinceLastSuccess { get; set; }
    [Required, StringLength(128)]
    public string Password { get; set; }
    public DateTime? PasswordChangedDate { get; set; }
    [Required, StringLength(128)]
    public string PasswordSalt { get; set; }
    [StringLength(128)]
    public string PasswordVerificationToken { get; set; }
    public DateTime? PasswordVerificationTokenExpirationDate { get; set; }

    public ICollection<Role> Roles { get; set; }

    //[ForeignKey("UserId")]
    //public ICollection<OAuthMembership> OAuthMemberships { get; set; }
}
于 2014-02-13T11:36:27.270 回答
0

好的,我刚刚发现...我使用代码第一类来声明系统在初始化 simplemembership 时创建的表的结构...(因为我需要将角色放在一个对象中以从网站管理它)

例子:

   [Table("webpages_OAuthMembership")]
    public class OAuthMembership
    {
        [Key, Column(Order = 0), StringLength(30)]
        public string Provider { get; set; }

        [Key, Column(Order = 1), StringLength(100)]
        public string ProviderUserId { get; set; }

        public int UserId { get; set; }

        //[Column("UserId"), InverseProperty("OAuthMemberships")]
        //public Membership User { get; set; }
    }

一些FK错了..耶稣....

希望它会帮助某人

于 2013-04-17T20:38:30.177 回答