2016-08-10 9 views
5

環境:.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と同じにしてはいけませんか?

答えて

1

[注:次のコードはAsp.Netコアには適用されません。 Asp.Net Coreでの認証については、を参照してください。

私はAsp.Netを初めて使用しています。私にとっては期待どおりに動作します。多分私のコードはあなたのためのアイデアを発することができます。

internal static void Main(string[] args) { _userStore = new UserStore<ApplicationUser>(new IdentityDbContext<ApplicationUser>()); _userManager = new UserManager<ApplicationUser>(_userStore); var x = new ApplicationUser(); x.UserName = "Test"; foreach(string error in _userManager.Create(x, "password").Errors) { Console.WriteLine(error); } Console.WriteLine(_userManager.CheckPassword(x, "password")); var f = ChangePasswordAsync(x, "password", "pass12345"); f.ContinueWith(delegate { if (f.IsFaulted) { Console.WriteLine(f.Exception.Message); } }).ContinueWith(delegate { Console.WriteLine(_userManager.CheckPassword(x, "password")); }); Console.ReadKey(true); } private static UserStore<ApplicationUser> _userStore; public class ApplicationUser : IdentityUser { } private static UserManager<ApplicationUser> _userManager; public static Task<IdentityResult> ChangePasswordAsync(ApplicationUser user, string currentPassword, string newPassword) { return _userManager.ChangePasswordAsync(user.Id, currentPassword, newPassword); }

+0

私は手動で新しいのUserManagerを初期化しようとすると、私は変数の束を渡しすることに終わります。私はUserManagerのクラスに見ているだけコンストラクタはこれです: '公共のUserManager(IUserStore 店、IOptions optionsAccessor、IPasswordHasher passwordHasher、IEnumerableを> userValidators、IEnumerableを> passwordValidators、ILookupNormalizer keyNormalizer、IdentityErrorDescriberエラー、IServiceProviderサービス、ILogger > logger); – Kizmar

+0

コアであれば、 'new Microsoft.AspNetCore.Identity.UserManager ()'を使用しないでください。 – Kizmar

+0

申し訳ありませんが、間違ったバージョンのAsp.Netを使用していました。私はVisual Studioで新しいAsp.Net Core WebApplicationプロジェクトを開きました。あなたが取っていたApplicationUserServiceを見つけることさえできません。プロジェクトのパスワード変更が機能しました。必要があれば、ここにいくつかのドキュメントがあります:https://docs.asp.net/en/latest/security/authentication/identity.html –

関連する問題