. net Core 1 Identity UserManager缓存的用户列表没有更新

本文关键字:列表 用户 更新 缓存 Core Identity UserManager net | 更新日期: 2023-09-27 18:01:39

环境:. net Core 1, EF,使用Identity进行身份验证,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)在Controller的构造函数中注入UserManager和SignInManager是可行的

3)我还测试了在Controller构造函数中使用IServiceProvider。我注入了IServiceProvider,然后使用GetService方法设置管理器:_userManager = serviceProvider.GetService<UserManager<ApplicationUser>>();。这与#1的结果相同。

In #1 :它会保存到数据库中,但是当以后使用时,管理人员似乎不知道数据的变化。在这两种情况下,我都必须重新初始化应用程序(停止并启动服务器),以便更新缓存的数据。

#3不应该和#2一样吗?

. net Core 1 Identity UserManager缓存的用户列表没有更新

[注意:下面的代码不适用于Asp。净的核心。用于Asp中的身份验证。[/p]

我是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); } 之前