環境:.Net Core 1、EF、認証用のID、承認用のJWTトークン。.Net Core 1 Identity UserManagerキャッシュされたユーザーリストが更新されない
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);
}
[EDIT]
私はこれはかなりまだケースである理由はわからないんだけど、私はちょうど気づいた私はのUserManagerとSignInManagerを注入した場合コントローラーのコンストラクターに直接(サービスレイヤーの代わりに)、それはうまくいくようです。
[EDIT 2]
所見の概要:
1)サービスは、コントローラコンストラクタに完全に動作しないこと注入次に、サービスコンストラクタへのUserManagerとSignInManagerを注入します。
2)UserManagerとSignInManagerをControllerコンストラクタに挿入すると機能します。
3)コントローラコンストラクタでIServiceProviderの使用方法もテストしました。私はIServiceProviderを注入し、次にGetServiceメソッドを使ってマネージャを設定します:_userManager = serviceProvider.GetService<UserManager<ApplicationUser>>();
。これは#1と同じ結果でした。
#1 &#3:これはデータベースに保存されますが、後で使用する場合、マネージャはデータ変更を認識していないようです。どちらの場合も、キャッシュされたデータを更新するために、アプリケーションを再初期化する必要がありました(サーバーの停止と起動)。
#3は#2と同じにしてはいけませんか?
私は手動で新しいのUserManagerを初期化しようとすると、私は変数の束を渡しすることに終わります。私はUserManagerのクラスに見ているだけコンストラクタはこれです: '公共のUserManager(IUserStore店、IOptions optionsAccessor、IPasswordHasher passwordHasher、IEnumerableを> userValidators、IEnumerableを> passwordValidators、ILookupNormalizer keyNormalizer、IdentityErrorDescriberエラー、IServiceProviderサービス、ILogger > logger); –
Kizmar
コアであれば、 'new Microsoft.AspNetCore.Identity.UserManager()'を使用しないでください。 –
Kizmar
申し訳ありませんが、間違ったバージョンのAsp.Netを使用していました。私はVisual Studioで新しいAsp.Net Core WebApplicationプロジェクトを開きました。あなたが取っていたApplicationUserServiceを見つけることさえできません。プロジェクトのパスワード変更が機能しました。必要があれば、ここにいくつかのドキュメントがあります:https://docs.asp.net/en/latest/security/authentication/identity.html –