我正在使用ASP.NET Core 1.0和身份资料来验证和授权用户 . 这一切都很好,除了一件事:
如果用户重置或更改其密码,则在重新启动ASP.NET应用程序之前,他无法使用新凭据登录 . 表示新密码已成功保存在数据库中,但Method _signInManager.PasswordSignInAsync()
不使用当前数据,而是使用旧数据 . 似乎在EF Core或SignInManager / UserStore中有类似缓存的东西 .
注册后登录工作也很好,重置或更改密码后只是一个问题 .
2 回答
找到问题的原因:Auth在一个单独的MiddleWare中完成,它具有错误的初始化并使用旧的EF DbContext .
将DbContext与DI一起使用是ASP.NET Core中的一个大问题 . DbContext应该在一个非常小的范围内使用,用简单的using语句定义 . 不幸的是,ASP.NET Core身份使用在DI中注册的DbContext . 更好的解决方案是将一个DbContext工厂注册到DI,以创建一个需要它的小范围DbContext加班 .
我也发现使用过时的DbContext我的身份验证中间件有问题 .
一种解决方案是使用以下代码行刷新auth中间件的身份解析器中的用户:
await _dbContext.Entry(userToVerify).ReloadAsync();
在此之后,我能够根据最新数据验证用户的凭据 .