0

ASP.NET ID を既存の (複雑な) データベース モデルにマップするカスタム UserStore を実装しようとしています。データベースには、ユーザー データの保存に使用する既存のテーブル 'Contact' があります。そのテーブルには int identity(1,1) 主キーがあります。そこで、IUser を実装する「ContactUser」という名前のクラスと、IUserStore を実装する「ContactUserStore」というクラスを作成しました。基本的なログインが機能するようになりました。

ただし、新規ユーザー登録が機能しません。私がやろうとすると:

IdentityResult result = await UserManager.CreateAsync(user, model.Password);

userId が見つからないというエラーが表示されます。

これは、AspNet Identity が ContactUserStore.CreateAsync(ContactUser user) を呼び出したときにデータベースに作成された Contact レコードの ID キーを認識していないことが原因です。そのメソッドは正常に完了しますが (連絡先レコードの作成)、作成したばかりのユーザーではない userId = 0 で ContactUserStore.FindByIdAsync(int userId) を呼び出します...

CreateAsync() でデータベースに作成された userId の @@identity 値を返す方法はありますか? または、作成後に FindByName() または FindByEmail() メソッドを使用してユーザーを選択するように強制しますか?

4

2 に答える 2

2

私は自分で問題を解決しました。Microsoft.AspNet.Identity.Core アセンブリを反映して、何が起こっているのか、それを修正する方法を理解する必要がありました。

問題は、SignIn() によって呼び出された ClaimsIdentityFactory で実際に発生していたことが判明しました。この関数は、初期化されていない Id を持つユーザー オブジェクトを受け取り、UserStore.FindByIdAsync() を実行します。私がしなければならなかったことは、ClaimsIdentityFactory をサブクラス化し、CreateAsync をオーバーライドし、Id=0 条件をチェックすることでした。その場合、FindByName を実行して ID を取得します。ID を取得するために @@identity を使用したいのですが、今のところはこれでうまくいきます。

誰かが興味を持っている場合に備えて、(完全にテストされていない)コードを github に掲載します(マイクロ ORM を使用するカスタム ID プロバイダー)。

于 2014-04-18T00:10:21.973 に答える