5

環境: .Net Core 1、EF、認証に ID、承認に JWT トークンを使用。

メソッドを使用UserManager.ChangePasswordAsync()するとデータベースが適切に更新されますが、UserManager.Usersリストは更新されません (仮定)。

Startup.cs では単純に を使用してapp.UseIdentity()おり、ApplicationUserServiceコンストラクターではUserManager<ApplicationUser>. それ以外のカスタムは行っていません。

例: ユーザーがパスワードを「password1」から「password2」に変更したとします。そのユーザーがログアウトして再度ログインしても、UserManager はパスワードが「password1」であると認識します。WebAPI サーバーを再起動したら、ログインを試みます。「password2」で期待どおりに機能します。したがって、データベースは間違いなく更新されていますが、UserManager のスコープ/キャッシュは更新されていません。

UserManager のデフォルトの DI スコープが (リクエストごとではなく) シングルトンかどうか疑問に思っていますか? UserStore のキャッシュされたユーザー リストを更新しないと、この問題が発生することがわかりました。

助言がありますか?さらにコードが必要ですか?

ApplicationUserService (簡略化):

private readonly UserManager<ApplicationUser> _userManager;

public ApplicationUserService(UserManager<ApplicationUser> userManager)
{
     _userManager = userManager;
}

public Task<IdentityResult> ChangePasswordAsync(ApplicationUser user, string currentPassword, string newPassword)
{
    return _userManager.ChangePasswordAsync(user, currentPassword, newPassword);
}

[編集]

なぜこれが当てはまるのかはまだわかりませんが、UserManager と SignInManager をコントローラーのコンストラクターに (サービス層ではなく) 直接挿入すると、問題なく動作するように見えることに気付きました。

[編集2]

調査結果の要約:

1) UserManager と SignInManager を Service コンストラクターに注入してから、その Service を Controller コンストラクターに注入しても、完全には機能しません。

2) UserManager と SignInManager を Controller コンストラクターに挿入すると機能します。

3) Controller コンストラクターでの IServiceProvider の使用もテストしました。IServiceProvider を注入し、GetService メソッドを使用してマネージャーを設定しました_userManager = serviceProvider.GetService<UserManager<ApplicationUser>>();。これは#1と同じ結果でした。

#1 & #3: データベースに保存されますが、管理者は後で使用したときにデータの変更に気付かないようでした。どちらの場合も、キャッシュされたデータを更新するために、アプリケーションを再初期化 (サーバーを停止してから開始) する必要がありました。

#3 は #2 と同じように機能するべきではありませんか?

4

1 に答える 1