C# .Net Core 1 Identity UserManager缓存用户列表未更新

C# .Net Core 1 Identity UserManager缓存用户列表未更新,c#,asp.net-core,identity,usermanager,C#,Asp.net Core,Identity,Usermanager,环境:.Net核心1,EF,使用标识进行身份验证,使用JWT令牌进行授权 遇到使用UserManager.ChangePasswordAsync()方法正确更新数据库,但没有更新UserManager.Users列表的问题(假设) 在Startup.cs中,我们只需使用app.UseIdentity(),而在ApplicationUserService构造函数中,我们注入了UserManager。除此之外,我们什么都不做 例如:假设用户将其密码从“password1”更改为“password2”

环境:.Net核心1,EF,使用标识进行身份验证,使用JWT令牌进行授权

遇到使用
UserManager.ChangePasswordAsync()
方法正确更新数据库,但没有更新
UserManager.Users
列表的问题(假设)

在Startup.cs中,我们只需使用
app.UseIdentity()
,而在
ApplicationUserService
构造函数中,我们注入了
UserManager
。除此之外,我们什么都不做

例如:假设用户将其密码从“password1”更改为“password2”。如果该用户注销并重新登录,UserManager仍然认为密码是“password1”。如果我重新启动WebAPI服务器,然后尝试登录;它的工作原理与“password2”一样。所以它肯定是在更新数据库,但是UserManager的作用域/缓存没有被更新

我想知道UserManager的默认DI范围是否为singleton(而不是每个请求)?如果不更新UserStore的缓存用户列表,我可以看到导致此问题的原因

有什么建议吗?需要更多的代码吗

ApplicationUserService(简化):

private readonly UserManager\u UserManager;
公共应用程序服务(UserManager UserManager)
{
_userManager=userManager;
}
公共任务ChangePasswordAsync(ApplicationUser用户、字符串currentPassword、字符串newPassword)
{
返回_userManager.ChangePasswordAsync(user、currentPassword、newPassword);
}
[编辑]

我还不确定为什么会出现这种情况,但我刚刚意识到,如果我直接将UserManager和SignInManager注入控制器的构造函数(而不是服务层),它似乎工作得很好

[编辑2]

调查结果摘要:

1) 将UserManager和SignInManager注入到服务构造函数中,然后将该服务注入到控制器构造函数中并不完全有效

2)将UserManager和SignInManager注入控制器构造函数是可行的。

3) 我还测试了在控制器构造函数中使用IServiceProvider。我注入了IServiceProvider,然后使用GetService方法设置管理器:
\u userManager=serviceProvider.GetService()。这与#1的结果相同

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


#3的工作原理不应该与#2相同吗?

[注意:以下代码不适用于Asp.Net Core。有关Asp.Net Core中的身份验证,请参阅。]

我是Asp.Net新手,但我试着按照你所描述的做。对我来说,这是意料之中的事。也许我的代码能激发你的想法

内部静态void Main(字符串[]args)
{
_userStore=newuserstore(new IdentityDbContext());
_userManager=新的userManager(_userStore);
var x=新的ApplicationUser();
x、 用户名=“测试”;
foreach(userManager.Create(x,“password”).Errors中的字符串错误)
{
控制台写入线(错误);
}
Console.WriteLine(_userManager.CheckPassword(x,“password”));
var f=ChangePasswordAsync(x,“password”,“pass12345”);
f、 与(代表)继续
{
如果(f.IsFaulted)
{
Console.WriteLine(f.Exception.Message);
}
}).与(代表)继续
{
Console.WriteLine(_userManager.CheckPassword(x,“password”));
});
Console.ReadKey(true);
}
私有静态UserStore\u UserStore;
公共类应用程序用户:IdentityUser{}
私有静态UserManager\u UserManager;
公共静态任务ChangePasswordAsync(ApplicationUser用户、字符串currentPassword、字符串newPassword)
{
返回_userManager.ChangePasswordAsync(user.Id、currentPassword、newPassword);
}

当我试图手动初始化新的UserManager时,我最终不得不传入一组变量。我在UserManager类上看到的唯一构造函数是:
public UserManager(IUserStore存储、IOptions optionAccessor、IPasswordHasher密码hasher、IEnumerable userValidators、IEnumerable passwordValidators、ILookupNormalizer keyNormalizer、IdentityErrorDescriber错误、IServiceProvider服务、ILogger)
如果我们在Core中,是否应该使用新的Microsoft.AspNetCore.Identity.UserManager()
?抱歉,我使用了错误的Asp.Net版本。我在Visual Studio中打开了一个新的Asp.Net核心Web应用程序项目,但我甚至找不到您正在使用的ApplicationUserService。项目的密码更改工作正常。如果您需要它,这里有一些文档:我确实注意到我可以直接将UserManager和SignInManager注入控制器,并且一切正常。出于某种原因,当我尝试在服务层中使用它们时,我遇到了问题。您直接注入新的UserManager有什么具体原因吗?
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);
}

    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);
    }