gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:43:55 24 4
gpt4 key购买 nike

环境:.Net Core 1,EF,使用 Identity 进行身份验证,使用 JWT token 进行授权。

在使用 UserManager.ChangePasswordAsync() 时遇到问题方法正确更新数据库,但不更新 UserManager.Users列表(假设)。

在 Startup.cs 中,我们只是使用 app.UseIdentity() ,并在 ApplicationUserService构造函数,我们正在注入(inject) 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 直接注入(inject)到 Controller 的构造函数中(而不是注入(inject)到服务层中),它似乎工作得很好。

[编辑 2]

调查结果摘要:

1) 将 UserManager 和 SignInManager 注入(inject)到 Service 构造函数中,然后将该 Service 注入(inject)到 Controller 构造函数中并不完全有效。

2) 将 UserManager 和 SignInManager 注入(inject)到 Controller 构造函数中是可行的。

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

在#1 和#3 中:它会保存到数据库中,但管理人员似乎没有意识到以后使用时数据发生了变化。在这两种情况下,我都必须重新初始化应用程序(停止并启动服务器)以更新缓存数据。

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

最佳答案

[注:以下代码不适用于Asp.Net Core。有关 Asp.Net Core 中的身份验证,请查看 this documentation .]

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

关于c# - .Net Core 1 Identity UserManager 缓存的用户列表未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com