我正在使用ASP.NET Core 1.0和身份资料来验证和授权用户。这一切都很好,除了一件事:
如果用户重置或更改了密码,则在重新启动ASP.NET应用程序之前,他无法使用新凭据登录。表示新密码已成功保存在数据库中,但方法// Just create some test data.
IEnumerable<bool> test = Enumerable.Range(0, 12).Select(x => x%3 == 0);
// Compute the average number of items that are true, as a %.
var average = 100 * test.Average(x => x ? 1.0 : 0.0);
不使用当前数据,而是使用旧数据。似乎在EF Core或SignInManager / UserStore中有类似缓存的东西。
注册后登录工作也很好,重置或更改密码后只是一个问题。
答案 0 :(得分:3)
找到问题的原因: Auth是在一个单独的MiddleWare中完成的,它具有错误的初始化并使用旧的EF DbContext。
将DbContext与DI一起使用是ASP.NET Core中的一个大问题。 DbContext应该在一个非常小的范围内使用,用简单的using语句定义。不幸的是,ASP.NET Core身份使用在DI中注册的DbContext。更好的解决方案是将一个DbContext工厂注册到DI,以创建一个需要它的小范围DbContext加班。
答案 1 :(得分:2)
我也发现使用陈旧的DbContext我的身份验证中间件存在问题。
一种解决方案是使用以下代码行刷新auth中间件的身份解析器中的用户:
await _dbContext.Entry(userToVerify).ReloadAsync();
在此之后,我能够根据最新数据验证用户的凭据。