0

過去数時間、MVC 4 Web サイトに 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 は webpages_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 の外部キーがあることがわかりました。ローカル メンバーシップ レコードがなくても 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

わかりました...単純なメンバーシップを初期化するときに、システムによって作成されたテーブルの構造を宣言するコードファーストクラスを使用します... (Webサイトから管理するためにオブジェクトにロールを配置する必要があったため)

例:

   [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 に答える