環境: .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 と同じように機能するべきではありませんか?